当前位置: 首页 > news >正文

做分销网站好吗建设企业网站收费吗

做分销网站好吗,建设企业网站收费吗,免费做翻页页面的网站,软件技术专业简介后端编译#xff08;即时编译、提前编译#xff09;的目标时将字节码翻译成本地机器码#xff0c;而难点是输出优化质量较高的机器码#xff1b; 文章目录1. 优化技术概览2. 方法内联#xff08;Inlining#xff09;3. 逃逸分析#xff08;Escape Analysis#xff09;4…后端编译即时编译、提前编译的目标时将字节码翻译成本地机器码而难点是输出优化质量较高的机器码 文章目录1. 优化技术概览2. 方法内联Inlining3. 逃逸分析Escape Analysis4. 公共子表达式消除Common Subexpression Elimination5. 数组边界检查消除Array Bounds Checking Elimination1. 优化技术概览 PerformanceTacticIndex from OpenJDK Wiki compiler tactics编译器策略 delayed compilation延迟编译tiered compilation分层编译on-stack replacement栈上替换delayed reoptimization延迟优化program dependence graph representation程序依赖图表示static single assignment representation静态单赋值表示 speculative (profile-based) techniques基于性能监控的优化技术 optimistic nullness assertions乐观空值断言optimistic type assertions乐观类型断言optimistic type strengthening乐观类型增强optimistic array length strengthening乐观数组长度增强untaken branch pruning裁剪未被选择的分支optimistic N-morphic inlining乐观的多态内联branch frequency prediction分支频率预测call frequency prediction调用频率预测 proof-based techniques基于证据的优化技术 exact type inference精确类型推断memory value inference内存值推断memory value tracking内存值跟踪constant folding常量折叠reassociation重组operator strength reduction操作符退化null check elimination空值检查消除type test strength reduction类型检查退化type test elimination类型检查消除algebraic simplification代数简化common subexpression elimination公共子表达式消除integer range typing flow-sensitive rewrites数据流敏感重写 conditional constant propagation条件常量传播dominating test detectionflow-carried type narrowing基于流承载的类型缩减转换dead code elimination无用代码消除 language-specific techniques语言相关的优化技术 class hierarchy analysis类型继承关系分析devirtualization去虚拟机化symbolic constant propagation符号常量传播autobox elimination自动装箱消除escape analysis逃逸分析lock elision锁消除lock fusion所膨胀de-reflection反射消除 memory and placement transformation内存及代码位置变换 expression hoisting表达式提升expression sinking表达式下沉redundant store elimination冗余存储消除adjacent store fusion相邻存储合并card-mark eliminationmerge-point splitting交汇点分离 loop transformations循环变换 loop unrolling循环展开loop peeling循环剥离safepoint elimination安全点消除iteration range splitting迭代范围分离range check elimination范围查找消除loop vectorization循环向量化 global code shaping全局代码调整 inlining (graph integration)内联global code motion全局代码外提heat-based code layout基于热度的代码布局switch balancingSwith 调整throw inlining control flow graph transformation控制流图变换 local code scheduling本地代码编排local code bundling本地代码封包delay slot filling延迟槽填充graph-coloring register allocation着色图寄存器分配linear scan register allocation线性扫描寄存器分配live range splittingcopy coalescing复写聚合constant splitting常量分裂copy removal复写移除address mode matching地址模式匹配instruction peepholing指令窥孔优化DFA-based code generator基于正确有限状态机的代码生成 方法内联 // 原始代码 static class B {int value;final int get() {return value;} }public void foo() {y b.get();// ...do stuff...z b.get();sum y z; }// 内联后的代码即时编译实际效果是作用在代码中间表示或机器码之上的这里只是以 Java 代码演示效果 public void foo() {y b.value;// ...do stuff...z b.value;sum y z; }内联可以去除方法调用的成本如查找方法版本、建立栈帧等可以为其他哟花建立良好条件一般是优先级最高的优化手段 冗余访问消除Redundant Loads Elimination public void foo() {y b.value;// ...do stuff...z y;sum y z; }...do stuff... 不影响 b.value 的情况下可以将 zb.value 替换为 zy可以不再去访问 b 的局部变量消除了公共子表达式 b.valueCommon Subexpression Elimination 复写传播Copy Propagation public void foo() {y b.value;// ...do stuff...y y;sum y y; }变量 z 与变量 y 完全相等是没有必要使用的可以使用 y 代替 z 无用代码消除Dead Code Elimination public void foo() {y b.value;// ...do stuff...sum y y; }上述这些优化带来的代码压缩和执行效率提升在实际机器指令上会表现得更明显 2. 方法内联Inlining 最重要的优化技术之一把目标方法的代码原封不动的复制到发起调用的方法中实际 JVM 实现会复杂很多除了消除方法调用的成本查找方法版本、创建栈帧等更重要的是为其他优化建立良好基础 public static void foo(Object obj) {if (obj ! null) {System.out.println(do something);} }public static void testInline(String[] args) {Object obj null;foo(obj); }示例中全部是Dead Code但若没有内联就无法通过无用代码消除来优化掉这些 Dead Code 按照经典编译原理的优化理论大多数 Java 方法无法进行内联只有使用 invokespecial 调用私有方法、示例构造器、父类方法使用 invokestatic 调用静态方法使用 invokestatic 调用被 final 修饰的方法才会在编译期进行解析其他 Java 方法都属于虚方法都必须在运行时进行方法接收者的多态选择 如 b.get() 直接内联 b.value若无上下文将无法确认 b 的实际类型从而无法内联到对应方法 无法内联的解法 类型继承关系分析Class Hierarchy AnalysisCHA在整个应用程序范围做类型分析确认当前已加载的类中接口有哪些实现类、类是否存在子类、子类是否复写某个虚方法等 不是虚方法直接进行内联 是虚方法向 CHA 查询此方法在当前运行时状态下是否有多台选择若只有一个版本可假设应用程序的全貌就是只有一个版本从而进行守护内联Guarded Inlining此后 VM 可能加载新的类型从而改变 CHA因此这种内联属于激进预测性优化必须预备退路退回解释状态或重新编译若存在多态选择即时编译器将进行最后一次努力使用内联缓存Inline Cache来缩减方法调用开销 内联缓存Inline Cache建立在目标方法正常入口之前的缓存在未发生方法调用之前内联缓存状态为空当第一次调用发生后缓存记录下方法接收者的版本信息以后进来的每次调用比较其版本若版本一致单态内联Monomorphic Inline Cache可通过缓存调用仅比不内联的非虚方法调用多了一次类型判断开销若版本不一致则退化成超多态内联缓存Megamorphic Inline Cache相当于真正查找虚方法进行方法分派 方法内联优化与面向对象的编程方式相矛盾所以在 Java 语言进行方法内联大多数情况下都是激进优化而类似的激进优化在高性能 JVM 中极为常见比如激进优化移除出现概率很小的隐式异常、使用概率很小的分支等但这些优化都必须具备逃生门重回解释状态 3. 逃逸分析Escape Analysis 最前沿的优化技术之一分析对象动态作用域虽不是直接优化代码的手段却是其他优化措施的依据与前提类似继承关系分析 方法逃逸一个在方法里定义的对象可能被外部方法引用作为调用参数传递给其他方法线程逃逸一个对象被跨线程访问赋值给可能被其他线程访问的实例变量 逃逸分析的优化用途 栈上分配Stack Allocations JVM 对堆中分配的对象进行 GC 需要大量计算标记筛选出可回收对象并进行回收和整理若一个对象不会发生线程逃逸实际这类对象的比例很大这个对象就可能在栈上分配内存对象可以随方法的结束自动销毁GC 的压力将大幅下降 标量替换Scalar Replacement 将一个 Java 对象拆解成若干个用原始类型表示的成员变量若一个对象不会发生方法逃逸这个对象就可以被拆散为标量程序执行就不用创建这个对象而是直接在栈上创建成员变量栈上分配大几率分配到物理机器的高速寄存器中存储这还可以作为进一步优化的基础 - 标量无法再分解成更小数据表示的数据如 JVM 的原始数据类型 intlong 等以及 reference 类型 - 聚合量Aggregate一个可以继续分解的数据如 Java 中的对象 同步消除Synchronization Elimination若一个对象不会发生线程逃逸那么对这个变量的读写同步操作可以被安全的消除掉 逃逸分析的计算成本如复杂的数据流敏感的过程间分析非常高无法保证逃逸分析带来的性能收益高于它的消耗JDK 6 才开始支持逃逸分析Update 23 服务端编译器默认开启 inline 关键字定义 Java 内联类型可以实现 C# 中值类型相对应的功能可以令逃逸分析变得简单很多 逃逸分析模拟演示 // 原始代码 public int test(int x) {int xx x 2;Point p new Point(xx, 42);return p.getX(); }// 步骤1: 构造函数内联 public int test(int x) {int xx x 2;Point p point_memory_alloc(); // 在堆中分配 P 对象的示意方法p.x xx; // Point 构造函数被内联p.y 42return p.x; // Point::getX()被内联 }// 步骤2: 标量替换 public int test(int x) {int xx x 2;int px xx; // p.x 与 p.y 不会发生方法逃逸可以直接替换为标量 px、pyint py 42;return px; }// 步骤3: 无效代码消除 public int test(int x) {return x 2; // py 对运行效果无影响为 Dead Code可消除 }逃逸分析相关参数 -XX:DoEscapeAnalysis手动开启逃逸分析 -XX:PrintEscapeAnalysis查看分析结果 -XX:EliminateAllocations开启标量替换 -XX:EliminateLocks开启同步消除 -XX:PrintEliminateAllocations查看标量的替换情况 大型程序中实施逃逸分析可能出现效果不稳定的情况或分析过程耗时却无法有效判别出非逃逸对象导致性能即时编译的收益下降 4. 公共子表达式消除Common Subexpression Elimination 语言无关的经典优化技术之一对于公共子表达式没必要重复计算可以直接用前面计算的结果替换 公共子表达式如果一个子表达式已经被计算过且表达式中变量的值不曾发生变化那这个子表达式就可以当做公共子表达式基本代码块中的为局部公共子表达式Local Common Subexpression Elimination跨基本代码块则可称为全局公共子表达式Global Common Subexpression Elimination 公共子表达式消除演示 // 原始代码 int d (c * b) * 12 a (a b * c);javac 直译的 Class 格式效果 iload_2 // b imul // 计算b*c bipush 12 // 推入12 imul //计算(c*b)*12 iload_1 //a iadd //计算(c*b)*12a iload_1 //a iload_2 //b iload_3 //c imul //计算b*c iadd //计算ab*c iadd //计算(c*b)*12aab*c istore 4即时编译优化效果 // 将 c*b 和 b*c 用 E 表示消除公共子表达式 int d E * 12 a (a E);// 代数简化Algebraic Simplification int d E * 13 a a;5. 数组边界检查消除Array Bounds Checking Elimination 语言相关的经典优化技术之一Java 语言作为一门动态安全的语言会自动对数组的读写访问索引合法性做检查当超出地址范围则抛出 java.lang.ArrayIndexOutOfBoundsException这对软件开发很友好但对 JVM 却是一个性能负担若能在编译期根据数据流分析判定索引一直在数组边界内就可以消除数组上下边界的检测从而节省很多次条件判断操作 类似的消除还可以发生在空指针检查NullPointException、除数为零检查ArithmeticException、自动装箱消除Autobox Elimination、安全点消除Safepoint Elimination、消除反射Dereflection等针对这些检查的消除方式还可以采用隐式异常处理的思路 隐式异常处理示例 // 原始伪代码 if(foo ! null) {return foo.value; } else {throw new NullPointException(); }// 隐式异常消除后的伪代码 try {return foo.value; } catch (segment_fault) {uncommon_trap(); }JVM 注册一个 Segment Fault 信号的异常处理器uncommon_trap()针对进程层面的异常处理器与 try-catch 的线程级异常处理器不同当 foo 不为空可以省去判空的开销但若 foo 真为空会转到异常处理器涉及进程从用户态转内核态结束后再转用户态恢复中断并抛出 NullPointException这将远比一次判空要慢借助 VM 在运行期收集的性能监控信息判定 foo 极少为空时采用这样的优化方式会更值得 上一篇「JVM 编译优化」提前编译器 PS感谢每一位志同道合者的阅读欢迎关注、评论、赞 参考资料 [1]《深入理解 Java 虚拟机》
http://www.w-s-a.com/news/638621/

相关文章:

  • 网页设计构建的基本流程宜宾seo网站建设
  • 西安网站开发公司价格保定徐水网站建设
  • 学做川菜下什么网站软件著作权和专利的区别
  • 百度网站标题东莞外包公司有哪些
  • 织梦增加网站英文名称网页界面设计特点
  • 企业如何进行网站建设棋牌代理平台
  • 韩国做美食网站有哪些seo优化在线诊断
  • 网站建设规划模板做擦边网站
  • 做网站台式还是笔记本网上下载的免费网站模板怎么用
  • 高校网站群管理系统凡科建站是永久的吗
  • 深圳网站建设服务电话网站通栏设计素材
  • 网站里面的视频功能怎么做网站名注册
  • 网站游戏下载厦门php网站建设
  • 沈阳关键词网站排名一台服务器做两个网站吗
  • 哪个行业该做网站但是没有做dom手表官方网站
  • 网站建设费 大创wordpress中函数get
  • 怎样建设个自己的网站首页有没有专门教做扯面的网站
  • 网站后台怎么添加模板教育类网站开发公司
  • 网站的外链是什么php创建一个网站
  • 语文建设 官方网站网络工程可以从事什么工作
  • 无锡便宜做网站如何下载网站模板
  • 南宁高端网站网络小说网站推广策划方案
  • 苏州网站制作方法建设银行 网站
  • 技术网站推广范例素材网站哪个好
  • 网站找人做的他能登管理员吗网站建设一般多少钱
  • 衡水哪有做网站的wordpress主题站主题
  • 网络建设的流程网站公司注册资本
  • 杭州旅游团购网站建设建立一个网站需要哪些步骤
  • 实木餐桌椅网站建设浦东网站建设哪家好
  • 高端手机网站定制网站网络推广推广