当前位置: 首页 > 知识库问答 >
问题:

java 8中的编译代码与java 11中的编译代码

韦翰音
2023-03-14

我们目前在Java8中编译了代码,但我们在Java11 VM上运行它。现在我们也在尝试将代码移动到Java11编译时。想知道在Java8中编译代码与在Java11中编译代码在性能方面是否有任何好处,因为两个编译器都会生成不同的类文件(字节码)?在效率方面,一个与另一个有何不同?

共有1个答案

张卓
2023-03-14

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编译过。编译器错误?