我们目前在Java8中编译了代码,但我们在Java11 VM上运行它。现在我们也在尝试将代码移动到Java11编译时。想知道在Java8中编译代码与在Java11中编译代码在性能方面是否有任何好处,因为两个编译器都会生成不同的类文件(字节码)?在效率方面,一个与另一个有何不同?
javac不是一个优化编译器,所以一般来说,不要期望它在不同版本之间生成“更快”的字节码。优化是JVM的工作。
同时,Java编译器确实支持新的语言特性,并且可能支持新的JVM特性。其中一些确实对性能有影响。JDK 9-JDK 11中最著名的例子如下。
>
JEP 280:指示字符串串联(JDK 9)。
此JEP改变了字符串连接表达式的编译方式。在JDK 9之前,string表达式被翻译为
new StringBuilder().append()...append().toString();
尽管JIT识别出这样的链并试图在运行时对其进行优化,但这种优化是脆弱的,并不总是如预期的那样工作。使用invokedynamic编译字符串串联可以让JVM更自由地生成更好的代码。您可以在本JEP的注释中找到详细的解释和基准。
JEP 181:基于嵌套的访问控制(JDK 11)
这个JEP解决了访问嵌套类的私有成员的问题。在JDK 11之前,Java编译器为它们生成合成桥方法(示例)。
乍一看,这与性能无关。然而,在边缘情况下,由于内联深度限制,额外的合成方法可能会破坏内联。
基于嵌套的访问控制允许nestmate类在不使用合成桥的情况下访问彼此的私有成员,从而降低意外性能下降的风险。
更新
以前,我在这个列表中包含了JDK-8175883:用于增强循环的字节码生成,但正如@Holger在评论中注意到的那样,这种“优化”实际上并不起作用。
结论
Java编译器的变化主要与新的语言/JVM功能有关。字节码级别的优化不是目标。但是,其中一些更改也可能(间接)影响性能。无论如何,重新编译代码可能带来的性能优势通常很小,以至于您在实际应用程序中甚至不会注意到它们。
1.1. 代码编译 1.1.1. Openwrt编译 1.1.2. Kernel编译 1.1.3. Uboot编译 1.1.4. VSP编译 1.1. 代码编译 1.1.1. Openwrt编译 作为Kamino18 YODAOS的整体编译环境,使用openwrt可以编译出系统正常运行所需的主要image如下: 镜像名字 镜像运行位置 镜像说明 镜像生成位置 mcu.bin MCU The ima
PHP代码的编译 PHP是解析型高级语言,事实上从Zend内核的角度来看PHP就是一个普通的C程序,它有main函数,我们写的PHP代码是这个程序的输入,然后经过内核的处理输出结果,内核将PHP代码"翻译"为C程序可识别的过程就是PHP的编译。 那么这个"翻译"过程具体都有哪些操作呢? C程序在编译时将一行行代码编译为机器码,每一个操作都认为是一条机器指令,这些指令写入到编译后的二进制程序中,执行
ucore 代码编译 (1) 编译过程:在解压缩后的 ucore 源码包中使用 make 命令即可。例如 lab1中: [email protected]: ~/lab1$ make 在lab1目录下的bin目录中,生成一系列的目标文件: ucore.img:被qemu访问的虚拟硬盘文件 kernel: ELF格式的toy ucore kernel执行文,被嵌入到了ucore.img中
代码不编译。我不明白错误是什么,请帮忙) 错误文本:g-Wall-c“main.cpp”(/media/ad/4GB-NTFS/prog/laba2)main。cpp:In函数“int main()”:main。cpp:46:12:错误:调用“Record::Record()”记录r1;^主要的cpp:12:1:注意:候选者:Record::Record(std::\u cxx11::string
我正在尝试学习java的这个新GWT部分。。。 我做了我的第一个简单的应用程序 我命名了 我的模块:-HelloWorld 我收到以下错误: 2014年4月18日下午4:00:53爪哇。util。首选项。WindowsPreferences警告:无法在根0x8000002处打开/创建prefs根节点Software\JavaSoft\prefs。Windows RegCreateKeyEx(…)返
我已经用google的nacl编译器编译了一些Qt代码,但是ncval验证器不能运行它。许多例子中的一个: 以下是相关代码: 编译为: 在49b检查调用指令:这是验证器无法理解的。到底是什么会导致编译器发出一条调用自身中间的指令?有办法解决这个问题吗?我用-g-O0-fno-inline编译过。编译器错误?