编译器优化,运行时优化

0人阅读 评论(0) 收藏 举报
分类:

读深入理解JAVA虚拟机 第十,十一章,记一下内容

编译器优化,运行时优化

虚拟机设计团队把对性能的优化集中到了后端的即时编译器中,这个可以让那些不是由javac产生的class文件有(比如其他语言编译的class文件)也享受到编译器优化带来的好处。

但是javac做了许多针对java语言编码过程的优化措施,来改善程序员的编码风格和提高编码效率,相当多的新生的java语法特性,都是靠编译器通过“语法糖”实现,而不是虚拟机底层改进来支持。

javac编译器由java语言实现

语义分析与字节码生成过程中:

常量折叠

在编译期间,在进行标注检查的时候,有一个重要的动作叫做常量折叠,比如

int a= 1+2; 
//会直接在语法树上变成
int a = 3;

所以在代码里写a =1+2,不会比a =3在运行期增加任何的运算量

数据及控制流分析

局部变量final
局部变量的final类型,编译后,在class文件中是看不见final类型修饰符的,和不带final修饰符的局部变量,在class文件中是没有区别的

通过控制流分析flow()方法,来保证不会去改变带final字段的值,以及保证其他的赋值,返回值,各种if else路径流程的控制

语法糖

语法糖:对程序功能本身没有影响,但是能够增加程序的可读性,
比如java中的泛型,变长参数,自动装箱/拆箱,在虚拟机运行时是不支持这些语法的,他们在编译阶段被还原回简单的基础语法结构。这个过程叫做解语法糖

字节码生成

javac编译的最后一个阶段,把之前的语法树,符号表转化成字节码写到磁盘中,同时进行少量的代码优化工作
比如添加实例构造器()和类构造器();
比如字符串加号操作替换成stringBuffer或StringBuilder(取决于目标代码版本是否大于或等于JDK1.5)的append操作。

语法糖

条件编译:

    if(true){
        123...
    }else{
        456...
    }

针对这段代码,编译的时候会自动做优化,把不可达的else部分去掉,class文件中就变成只保留了“123…”的部分,连if(true)都去掉了。

根据布尔值的真假,编译器把分支中不成立的代码块消除掉。归属于解语法糖阶段。

其他的语法糖比如:泛型,自动装箱,自动拆箱,遍历循环,变长参数,条件编译,以及内部类,枚举类,断言语句,(jdk1.7以后的)对枚举和字符串的switch支持,try语句中定义和关闭资源等

运行期优化

方法内联

//以下是.java中的方法a和b
public void a(){
    aa....
    b();
}

public void b(){
    bb....  
}

//在运行时进行内联,变成下面的写法,并且会消除一些无用的行,做优化等等

public void a(){
    aa....
    bb....
}
查看评论

编译器的优化

http://hi.baidu.com/avpbwqlzdgbaitq/item/1163158ddbd262d8d0f8cd47 编译器的优化 5...
  • liumf2005
  • liumf2005
  • 2012-10-30 12:39:15
  • 1506

编译器常用优化方法

常量传播 、常量折叠 、内联、公共子表达式
  • dd864140130
  • dd864140130
  • 2015-10-29 18:38:58
  • 3398

避免软件延时被编译器优化

在编译器中可以设置优化等级,在高优化等级下,软件延时会被优化,使得软件延时的时间间隔变短,如下所示,会被优化的代码,假设时钟周期是1us(1MHz),则安下面的程序,则延时估计会在1ms左右。但如果编...
  • Alan0521
  • Alan0521
  • 2012-08-16 15:00:37
  • 905

浅谈编译器优化

“memory”比较特殊,可能是内嵌汇编中最难懂部分。为解释清楚它,先介绍一下编译器的优化知识,再看C关键字volatile。最后去看该描述符。  1、编译器优化介绍        内存访问速度远...
  • u010064842
  • u010064842
  • 2013-06-15 09:45:06
  • 1409

一点关于编译器不同优化级别的比较

实验目的 在编程语言中,对比不同编程风格的代码写法,或者通过使用不同的编译器和编译优化参数,通过编译器生成汇编代码,静态分析所生成汇编代码的运行效率。 实验平台、工具 在Windows平台下,采...
  • u010669765
  • u010669765
  • 2014-06-06 18:21:12
  • 1028

一个关于防止编译器优化特定代码的问题

问题描述(为简化问题,设想的以下代码): 有1个全局变量: int a = 0; 2个线程: A线程负责对a进行写: while (1)     a++; B线程负责对a...
  • u012187684
  • u012187684
  • 2014-03-04 20:43:42
  • 912

【优化程序性能】编译器的优化和限制

写程序最主要的目标是使他在所有的可能的情况下dou
  • u011708432
  • u011708432
  • 2014-05-02 23:00:11
  • 910

VS编译器优化诱发一个的Bug

Bug的背景 我正在把某个C++下的驱动程序移植到C下,前几天发生了一个比较诡异的问题。 驱动程序有一个bug,但是这个bug只能 Win32 Release 版本下的驱动才能重现。在 W...
  • liangzhao_jay
  • liangzhao_jay
  • 2014-06-16 17:30:36
  • 658

详解C语言volatile关键字(禁止编译器优化-原地址读取)

volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储...
  • shaozhanyu
  • shaozhanyu
  • 2013-10-23 16:44:46
  • 2088

GCC编译器优化选项分析及具体优化了什么

起因: 目前项目使用nios IDE作为开发平台,其使用的编译器为gcc的交叉编译器。在设定编译条件时,在debug模式下生成的程序正常,但是在release模式下会出现LCD显示的开端显示不全,缺...
  • mianhuantang848989
  • mianhuantang848989
  • 2015-04-01 18:04:26
  • 920
    个人资料
    等级:
    访问量: 124
    积分: 90
    排名: 121万+
    文章存档