首页
学习
活动
专区
圈层
工具
发布

深入理解jvm - 编译优化(下)

前言 本文接上文的内容继续讲述:深入理解jvm - 编译优化(上) 概述 补充后端优化的另一项内容提前编译器的处理 介绍jvm的几项重点优化措施 「方法内联(重要)」 「逃逸分析(先进)」 「公共子表达式消除...优点 解决即时编译器在程序中占用运算资源。...这里挑选了书中的几项内容进行介绍: 「方法内联(重要)」 「逃逸分析(先进)」 「公共子表达式消除(经典)」 「数组边界检查消除(语言经典)」 方法内联 含义:即把被内联的方法搬到内联块的内部。...❞ Java的具体实现:引入类型继承关系分析和实现,确定在目前已加载的类中,某个接口是否有多于一种的实现、某个类是否存在子类、某个子类是否覆盖了父类的某个虚方法等信息”。...公共子表达式 什么是公共子表达式?如果一个表达式E之前已经被计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就称为公共子表达式。

83510

Java编译器优化秘籍:字节码背后的IR魔法与常见技巧

SSA形式极大地简化了许多优化算法的实现,如常量传播、死代码消除、公共子表达式消除、寄存器分配等。...than 5");}公共子表达式消除公共子表达式消除(Common subexpression elimination,CSE)通过识别并消除重复的子表达式,避免在运行时多次计算相同的子表达式。...// 公共子表达式消除前的代码int a = x * y;int b = x * y;// 公共子表达式消除后的代码int a = x * y;int b = a;null判断消除null判断消除(Null...;System.out.println(str);边界检查消除边界检查消除(Bounds check elimination)通过在编译时分析代码,判断数组访问是否越界,从而在运行时避免不必要的边界检查...同时它还会增加一个基本块中的指令数量,从而为指令排序的优化算法创造机会。在循环展开的基础上,可以实现把多次计算优化成一个向量计算。

35510
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【AI系统】公共表达式消除原理

    旨在消除程序中重复计算的公共表达式,从而减少计算量和提高执行效率。 传统编译器的公共子表达式消除 概述 在程序中,有时会出现多个地方使用相同的表达式进行计算,并且这些表达式的计算结果相同。...下面分别两种常见的公共子表达式消除方法,分别是局部值编号(LVN)和缓式代码移动(LCM)。局部值编号是一种常见的局部公共子表达式消除,它通过局部散列表,在找到并消除公共子表达式。...AI 编译器中公共子表达式消除采取相同的思路,区别在于 AI 编译器中子表达式是基于计算图或图层 IR。通过在计算图中搜索相同结构的子图,简化计算图的结构,从而减少计算开销。...在细粒度等价集中的每一个等价集都可以看成是一组重复的表达式,但是这些表达式不能随意消除,需要判断 Value 所在的块是否支配需要替换的 Value 所在的块,如果支配则可以进行替换消除。...维护公共子表达式候选集,将节点和哈希值一一对应,当处理一个新的操作节点时,判断该节点的哈希值是否在公共子表达式候选集中,如果不存在,则将该操作节点及其哈希值添加到公共子表达式候选集中。

    36410

    《深入理解java虚拟机》学习笔记之编译优化技术

    如果把b.value看做是一个表达式,那也可以把这项优化看成是公共子表达式消除 (Common Subexpression Elimination),优化后的代码如下所示。...接下来,我们将继续查看如下的几项最有代表性的优化技术是如何运作的,它们分别是: 语言无关的经典优化技术之一:公共子表达式消除。 语言相关的经典优化技术之一:数组范围检查消除。...公共子表达式消除 公共子表达式消除是一个普遍应用于各种编译器的经典优化技术,它的含义是:如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为了公共子表达式...如果这种优化仅限于程序的基本块内,便称为局部公共子表达式消除,如果这种优化的范围涵盖了多个基本块,那就称为全局公共子表达式消除。...如果要完全准确地判断一个对象是否会逃逸,需要进行数据流敏感的一系列复杂分析,从而确定程序各个分支执行时对此对象的影响。

    63720

    JVM(1)---虚拟机在运行期的优化策略

    说明:虚拟机在执行方法的时候,会先判断该方法是否存在已经编译好的版本,如果存在,则执行编译好的本地机器码,否则,采用一边解释一边编译的方式。...编译器做了很多的编译优化策略,例如上面的无用代码消除就是其中的一种。 下面我们来讲讲大概都有哪些优化策略: 大概预览一波: 公共子表达式消除。 数组范围检查消除。 方法内联。 逃逸分析。...(1).公共子表达式消除 含义:如果一个表达式 E 已经计算过了,并且从先前的计算到现在 E 中的所有变量的值都没有发生变化,那个 E 的这次出现就成为了公共子表达式。...更常见的情况是数组访问发生在循环体中,并且使用循环变量来进行数组的访问,对于这样的情况,只要编译器通过数据流就可以判断循环变量的取值范围是否在[0, arr.length)之内,如果是,那么整个循环中就可以节省很多次数组边界检测判断的操劳了...代价就是当arr为空时,必须转入到异常处理器中恢复并抛出NullPointException异常,这个过程会从用户态转到内核态中处理,结束后在回到用户态,速度远比一次判断空检查慢。

    62041

    浅谈JVM运行期的几种优化手段

    上面提到的都是概念知识,虚拟机如何判断一段代码是否是“热点代码”呢?...三、运行期优化技术 HotSpot 虚拟机设计团队为了实现程序更快的执行效率,列出了很多的优化手段,比如方法内联、冗余访问消除、复写传播、无用代码消除、公共子表达式消除、数组边界检查消除、逃逸分析等。...3.1、公共子表达式消除 公共子表达式消除是一个普遍应用于各种编译器的经典优化技术。 如果一个子表达式已经计算过了,且表达式中变量的值不曾发生变化,那么这个子表达式就可以当做公共子表达式。...如果这种优化仅限于程序的基本块内,便称为局部公共子表达式消除;如果这种优化的范围涵盖了多个基本块,便称为全局公共子表达式消除。 举个简单的例子,假设存在以下代码。...// 将 c*b 和 b*c 用 E 表示,消除公共子表达式 int d = E * 12 + a + (a + E); 即时编译器还可能进行另一种叫做代数简化的优化,把表达式变为: // 代数简化

    44210

    JVM性能优化系列-(6) 晚期编译优化

    为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个过程的编译器称为即时编译器(Just In Time Compiler) java虚拟机规范中没有规定即时编译器应该如何实现...,本节主要针对以下四种优化技术: 语言无关的经典优化技术之一:公共子表达式消除 语言相关的经典优化技术之一:数组范围检查消除 最重要的优化技术之一:方法内联 最前沿的优化技术之一:逃逸分析 公共子表达式消除...公共子表达式消除是一个普遍应用与各种编译器的经典优化技术,它的含义是: 如果一个表达式E已经计算过了,并且从先前的计算到现在E中的所有变量的值都没有发生变化,那么E的这次出现就成为了公共子表达式 对于这种表达式...,没有必要花时间再对它进行计算,只需要直接用前面计算过的表达式结果替代E就可以了 如果这种优化仅限于程序的基本块内,便称为局部公共子表达式消除(Local Common Subexpression Elimination...),如果这种优化的范围涵盖了多个基本块,那就称为全局公共子表达式消除(Global Common Subexpression Elimination)。

    48210

    深度学习编译器之公共子表达式消除和死代码消除实现

    仍然是以OneFlow中基于MLIR进行实现的CSE Pass为例子来讲解。在解析代码实现的过程中,我发现基于MLIR来做公共子表达式消除的时候还顺带做了死代码消除的功能。...另外,在考虑公共子表达式消除的时候需要保证两个重复的操作处于同一个基本块中以及两个重复操作之间没有其它具有副作用的操作才可以消除。...在OneFlow的实现中只是对OneFlow的UserOp的特殊属性即OpName和SymbolID进行了擦除,用一个魔法属性来代替,这是因为这两个属性不应该去影响公共子表达式的消除。...总结 在阅读代码实现的过程中,我发现基于MLIR来做公共子表达式消除的时候还顺带做了死代码消除的功能。...另外,在考虑公共子表达式消除的时候需要保证两个重复的操作处于同一个基本块中以及两个重复操作之间没有其它具有副作用的操作才可以消除。

    95150

    《Java面试题集中营》- JVM 知识

    SOE排查:栈的深度一般为1000-2000深度,超过了深度或者超过了栈大小就会导致SOE,通过打印的日志定位错误代码位置,检测是否有无限递归,发生了死循环等情况,修改代码 如何判断对象可以回收或存活...第三阶段,在LIR上分配寄存器,并在LIR上做窥孔优化,最后产生机器码 Server Compiler: 会执行无用代码消除、循环展开、循环表达式外提、消除公共子表达式、常量传播、基本块重排序、范围检测消除...、空值检查消除,另外还能根据解释器或Client Compiler提供的性能监控信息,进行一些不稳定的激进优化,比如守护内联、分支频率预测等 几种经典的优化技术: 公共子表达式消除 如果一个表达式...E已经计算过,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为公共子表达式 数组范围检查消除 编译期就判断数组是否在合理的范围内,如果在,那就可以在循环中把数组的上下界检查消除...另外还有隐式异常处理,虚拟机会注册一个Segment Fault信号的异常处理器,但如果代码经常为空,消耗时间比判空慢,但虚拟机会根据运行期收集到的信息选择使用判空还是隐式异常处理 方法内联 一可以给“公共子表达式消除

    22810

    深入理解Java虚拟机(程序编译与代码优化)

    当解释器遇到一条回边指令时,会先查找将要执行的代码片段是否已经有编译好的版本,如果有,它将优先执行已编译的代码,否则就把回边计数器值加 1,然后判断方法调用计数器和回边计数器值之和是否超过计数器的阈值。...如果把 b.value 看做是一个表达式,那也可以把这项优化工作看成是公共子表达式消除。...接下来我们再讲讲如下几项最有代表性的优化技术是如何运作的,它们分别是: 公共子表达式消除; 数组边界检查消除; 方法内联; 逃逸分析。...公共子表达式消除 如果一个表达式 E 已经计算过了,并且从先前的计算到现在 E 中所有变量的值都没有发生变化,那么 E 的这次出现就成了公共子表达式。...如果这种优化仅限于程序的基本块内,便称为局部公共子表达式消除,如果这种优化的范围覆盖了多个基本块,那就称为全局公共子表达式消除。

    84510

    JVM之晚期(运行期)优化

    如果不存在已被编译过的版本,则将此方法的调用计数器值加1,然后判断方法调用计数器与回边计数器值之和是否超过方法计数器的阈值。...version,如果有,他将会优先执行已编译的代码,否则就把回边计数器的值加1,然后判断方法调用计数器与回边计数器之和是否超过回边计数器的阈值。...编译优化技术 虚拟机中的具有代表性的优化技术: **语言无关的经典优化技术之一:公共子表达式消除。 语言相关的经典优化技术之一:数组范围检查消除。...最重要的优化技术之一:方法内联 最前沿的优化技术之一:逃逸分析** 公共子表达式消除 如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那E的这次出现就成公共子表达式...,可以用原先的表达式进行消除。

    62420

    JVM笔记-后端编译与优化

    性能分析制导优化 解释器或客户端编译器在运行的过程中,会不断收集性能监控信息(方法版本选择、条件判断等),这些信息可以帮助 JIT 编译器对代码进行集中优化。 这一点在静态分析时是很难做到的。...它的行为理解起来其实很简单:就是在方法调用中,把目标方法的代码“复制”到调用的方法之中,避免发生真实的方法调用。...4.3 公共子表达式消除 4.3.1 公共子表达式 所谓公共子表达式,就是当有一个表达式 E 在以前被计算过,而且下次再遇到的时候 E 的所有变量都未改变,则这次 E 的出现就被称为「公共子表达式」。...根据作用域,公共子表达式的消除可分为两种:局部公共子表达式消除和全局公共子表达式消除。...代码在编译的时候,就根据控制流分析(可参考前文的前端编译)是否会产生数组越界,那么在运行期间不是就不用判断了吗? 5. 小结 本文主要分析了即时编译器和提前编译器,主要内容梳理如下: ?

    80010

    图优化技术

    常见的图优化技术包括常量折叠、公共子表达式消除、代数化简、算子融合等技术,接下来将分别简单介绍其原理。...公共子表达式消除 (Common Sub-Expression Elimination)在一个程序中, 如果几个表达式的类型、参数和输入均相同, 则将他们称做公共子表达式。...对于公共子表达式, 只需要计算其中一个表达式的值, 其他表达式的值可以通过赋值得到。这个过程就称作公共子表达式消除, 它是一种传统编译器中常用的优化手段, 经过迁移也可以应用到深度学习编译器中。...对于当前正在处理的 OP, 先查找该 MAP 表, 如果能找到其他和正在处理的 OP 类型相同的 OP, 则对他们进行遍历, 如果其中某个 OP 的输入和参数与当前正在处理的 OP 相同, 则它们为公共子表达式...因此算子融合的难点在与如何为融合后的 OP 实现计算逻辑?

    1.3K51

    晚期(运行期)优化

    2、当程序运行环境中内存资源限制较大,可以使用解释执行节约内存,反之可以使用编译执行来提升效率。...编译优化技术 编译优化技术的代码优化变换是建立在代码的某种中间表示或机器码之上,绝不是建立在java源码之上的。...最有代表性的优化技术如下: 1、公共子表达式消除:如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为了公共子表达式。...2、数组边界检查消除:java语言是一门动态安全的语言,每次对数组的读写访问时都会执行数组是否越界检查。...其基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,称为逃逸。

    54600

    JVM系列七(JIT 即时编译器).

    然而,程序员在开发过程中,压根不会感知到即时编译器的存在,也参与不了即时编译器的过程,所以我们对即时编译器的学习更多的是了解,明白怎么写代码才能更好的被即时编译器优化。...公共子表达式消除 如果一个表达式 E 已经计算过了,并且从先前的计算到现在 E 中所有变量的值都没有发生变化,那么 E 的这次出现就成为了公共子表达式。...提取公共子表达式 int E = c * b; d = E * 12 + a + (a + E); // 2....虚拟机一般是在即时编译期间通过数据流分析来确定是否可以消除这种检查,比如 foo[3] 的访问,只有在编译的时候确定 3 不会超过 foo.length - 1 的值,就可以判断该次数组访问没有越界,就可以把数组边界检查消除...逃逸分析 逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,称为方法逃逸;甚至还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量

    1.3K10

    两分钟看懂有效的括号

    大家好,我是程序员吴师兄,今天跟大家分享一道和 栈 有关的题目,超级简单也超级容易理解,这道题目曾经出现在 bilibili 的面试中。...一、题目描述 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。...无效的情况: 1)长度为奇数,左括号多余 image.png 2)长度为奇数,右括号多余 image.png 3)长度为偶数,左括号与右括号不配对 image.png 4)长度为偶数,部分子表达式可以配对...,比如 { [ ( ) ]} ,如果部分子表达式无效,那么整体都是无效的 3、部分子表达式如果建立了配对关系,是有效的括号,那么 消除 后是不会影响整体的 4、奇数长度的字符串总是无效的。...消除 的过程是由内向外进行,先判断能否消除部分子表达式(内),再判断能否消除整体表达式(外),但在遍历的过程却是由外向内进行遍历,需要保存状态,栈 先进后出的特点符合要求。

    61820

    JAVA相关编译知识

    通过判断他们两个是否达到一定数值来判断是不是热点代码。缺点是需要为每个方法建立维护计数器不能够得到虚拟机栈中的调用信息;优点是统计的结果更加准确。...而第一种基于方法的则是在每次调用方法时才进行的判断(这个时候方法栈帧还未建立)而不是像循环体一样在每次碰到循环时(栈帧已经建立)都进行判断这时候循环体是已经在栈中运行的,所以第一种方法不是栈上替换。...判断是不是同一个调用着我也就是类型判断比起在虚方法表中查找效率也会更高一些)。 二,逃逸分析:名字听着高大上,其实就是看创建的对象会不会逃逸。...三,公共子表达式消除:如果一个表达式E之前已经被计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就称为公共子表达式。...四,数组边界检查消除:java中每次都进行读取或操作数组中的元素时都要进行对访问的下标进行判断其是否大于等于0并且没有超出数组的最大长度的限制。

    84620

    常用的正则表达式

    匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。 _n_是一个非负整数。匹配确定的_n_次。...这种情况下,尽可能地(如果不是完全地)消除误匹配以及漏匹配,并提升运行效率,就是我们的目标。本文所提出的经验,主要是针对这种情况。 掌握语法细节。正则表达式在各种语言中,其语法大致相同,细节各有千秋。...这样做的目的是先消除漏匹配(刚开始先尽可能多地匹配,做加法),然后再一点一点地消除误匹配(做减法)。这样有先有后,在考虑时才不易出错,从而向“不误不漏”这个目标迈进。 留有余地。...对于这样的情况,在写正则表达式时要跳出所能见到的文本的圈子,开拓思路,作出“战略性前瞻”。例如,经常收到这样的垃圾短信:“发*票”、“发#漂”。...例如,虽然A和B这两种情况只要有一种能够击中所需要的文本模式就会成功匹配,但是如果只要有一条子表达式(例如A)会产生误匹配,那么不论其它的子表达式(例如B)效率如何之高,范围如何精准,C的总体精准度也会因

    1.2K10

    正则表达式总结

    九、负向零宽断言 确保某个字符是否出现,但是不想去匹配它。 …… 十、注释 (?#command):凡是在注释#内的,包括回车、换行写的都不看。...b,则匹配为aab和ab;(这里认为“以b结尾”是以第一个碰到的b结尾,在中间就截断了) 注意:优先级→ 贪婪匹配>懒惰匹配 十二、如何写出高效率的正则表达式 如果纯粹是为了挑战自己的正则水平,用来实现一些特效...这样做的目的是先消除漏匹配(刚开始先尽可能多地匹配,做加法),然后再一点一点地消除误匹配(做减法)。这样有先有后,在考虑时才不易出错,从而向“不误不漏”这个目标迈进。 5. 留有余地。...对于这样的情况,在写正则表达式时要跳出所能见到的文本的圈子,开拓思路,作出“战略性前瞻”。例如,经常收到这样的垃圾短信:“发*票”、“发#漂”。...例如,虽然A和B这两种情况只要有一种能够击中所需要的文本模式就会成功匹配,但是如果只要有一条子表达式(例如A)会产生误匹配,那么不论其它的子表达式(例如B)效率如何之高,范围如何精准,C的总体精准度也会因

    1.2K50

    编译原理笔记(七)之代码优化「建议收藏」

    第4章已经简单介绍了表达式的DAG表示,目的是消除树中的公共子树。...现在我们将DAG的概念扩展到一个基本块中的表达式集合,用下述方法构造基本块的DAG: 出现在基本块中的每个变量的初始值在DAG中有一个节点。 块中的每条语句s关联一个节点N。...输出节点的特点是其中的变量在退出基本块后仍然活跃,即变量的值在流图的其他基本块中可能会被引用。...找出局部公共子表达式 当需要在DAG中加入一个新节点M时,考察是否已存在其孩子个数、次序以及运算符均与M相同的节点N,若有,则N和M计算的是相同的值并且可以用N取代M....死代码消除 DAG上对应死代码消除的操作可以这样实现:从 DAG中删除没有附加任何活跃变量的根(即没有前驱的节点)。重复此操作可以消除掉DAG中所有相应的死代码。

    1.3K20
    领券