语言无关的经典优化技术之一:公共子表达式消除。

公共子表达式消除是一个普遍应用于各种编译器的经典优化技术,他的含义是:如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为了公共子表达式。对于这种表达式,没有必要花时间再对他进行计算,只需要直接用前面计算过的表达式结果代替E就可以了。如果这种优化仅限于程序的基本块内,便称为局部公共子表达式消除(Local Common Subexpression Elimination),如果这种优化范围涵盖了多个基本块,那就称为全局公共子表达式消除(Global Common Subexpression Elimination)。举个简单的例子来说明他的优化过程,假设存在如下代码:

int d = (c*b)*12+a+(a+b*c);

如果这段代码交给Javac编译器则不会进行任何优化,那生成的代码如下所示,是完全遵照Java源码的写法直译而成的。

iload_2 // b
imul // 计算b*c
bipush 12 // 推入12
imul // 计算(c*b)*12
iload_1 // a
iadd // 计算(c*b)*12+a
iload_1 // a
iload_2 // b
iload_3 // c
imul // 计算b*c
iadd // 计算a+b*c
iadd // 计算(c*b)*12+a+(a+b*c)
istore 4

当这段代码进入到虚拟机即时编译器后,他将进行如下优化:编译器检测到”c*b“与”b*c“是一样的表达式,而且在计算期间b与c的值是不变的。因此,这条表达式就可能被视为:

int d = E*12+a+(a+E);

这时,编译器还可能(取决于哪种虚拟机的编译器以及具体的上下文而定)进行另外一种优化:代数化简(Algebraic Simplification),把表达式变为:

int d = E*13+a*2;

表达式进行变换之后,再计算起来就可以节省一些时间了。

JVM编译优化技术:公共子表达式消除。相关推荐

  1. 【编译原理笔记19】代码优化: 支配结点和回边,自然循环及其识别,删除全局公共子表达式和复制语句,代码移动,作用于归纳变量的强度削弱,归纳变量的删除

    本次笔记内容: 8-10 支配结点和回边 8-11 自然循环及其识别 8-12 删除全局工工资表达式和赋值语句 8-13 代码移动 8-14 作用于归纳变量的强度削弱 8-15 归纳变量的删除 本节课 ...

  2. 自动矢量化编译优化技术(Automatic Vectorization)

    自动矢量化技术,是编译器代码优化技术的一种,即在不改变C/C++源代码的情况下,自动编译产生使用单指令多数据(Single Instruction Multiple Data,SIMD)指令集的二进制 ...

  3. 「JVM 编译优化」javac 编译器源码解读

    Java 的编译过程 前端编译: 编译器的前端,将 Java 文件转变成 Class 文件的过程:如 JDK 的 javac.Eclipse JDT 中的增量式编译器 ECJ: 即使编译: JIT,J ...

  4. JVM成神之路-HotSpot虚拟机-编译原理、JIT、编译优化

    Java编译原理 什么是字节码.机器码.本地代码? 字节码是指平常所了解的 .class 文件,Java 代码通过 javac 命令编译成字节码 机器码和本地代码都是指机器可以直接识别运行的代码,也就 ...

  5. JVM编译过程与后期的优化

    文章目录 一.JVM编译过程 二.即时编译器优化(后期优化) 1.编译器 2.编译触发的条件 3.编译优化技术(挑重要的讲几个) 三.后记 一.JVM编译过程 引用自博客:https://blog.c ...

  6. JIT 即时编译及优化技术

    JIT 即时编译及优化技术 前言 即时编译 热点代码探测 编译优化技术 语言无关的经典优化技术之一:公共子表达式消除 语言相关的经典优化技术之一:数组范围检查消除 最重要的优化技术之一:方法内联 最前 ...

  7. Java JVM 虚拟机编译器性能增强优化技术

    专栏原创出处:github-源笔记文件 ,github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明. Java JVM-虚拟机专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Java ...

  8. 理解java虚拟机工作后了解吗,【深入理解JAVA虚拟机】第4部分.程序编译与代码优化.2.运行期优化。这章提到的具体的优化技术,应该对以后做性能工作会有帮助。...

    1.概述 Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为"热点代码"(Hot Spot C ...

  9. 15个问题自查你真的了解java编译优化吗?

    摘要:为什么C++的编译速度会比java慢很多?二者运行程序的速度差异在哪? 了解了java的早期和晚期过程,就能理解这个问题了. 本文分享自华为云社区<你真的了解java编译优化吗?15个问题 ...

最新文章

  1. c语言整数检验,C程序整数缺陷的检测与修复
  2. SVN使用过程中遇到的一些问题
  3. linux 打开大文件命令,linux查看大文本文件命令
  4. 服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止
  5. 如何注册Spring Bean
  6. x264 编码器选项分析 (x264 Codec Strong and Weak Points) 2
  7. Linux查看安装了哪些软件
  8. Postgresql_最新版11.2源码编译安装
  9. 传统制造业和工业如何和大数据进行结合
  10. Python语言程序设计 嵩天
  11. 【Love2d从青铜到王者】第十五篇:Love2d之角度和距离(Angles and distance)
  12. 女赛--Girl Love Value (01背包)
  13. QT 怎么获取linux本机的IP地址?
  14. Nature子刊:教你零基础开展微生物组数据分析和可视化
  15. [ISCC 2021]部分wp
  16. 制作WIN10U盘启动盘
  17. 利用勾子监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理
  18. Xilinx 7系FPGA总览
  19. AVPlayer进行视频播放
  20. WheelTec ROS 机器人小车 ROS2 编码编译解决

热门文章

  1. Broadcom WICED Wi-Fi 研究BCM943362WCD4之初始化
  2. 运行 Java 程序的主函数的解释
  3. 埙曲推荐,《牧羊曲》简谱
  4. SQL中的distinct的使用方法
  5. 【我的创作纪念日—5周年】
  6. 流畅运行python matlab的笔记本_科研狗求推荐笔记本,主要软件 Matlab
  7. 什么是JQuery?JQ的基本使用
  8. 什么是流式、版式软件
  9. 通过 pGina 对 Windows 设备进行管理
  10. 【嵌入式小白学习】--在STM32开发板上实现简单的串口通信