1

我想知道,在编译为 java 1.4 编写的 java 源代码并将 -source 和 -target 开关设置为 1.4 时,是否会使用它们之间的版本中内置的一些/任何优化。我的第一个意图当然是不说,因为编译后你会得到一组指令,这些指令以原始 1.4 VM 为目标。然后我认为,由于编译器只是更智能地使用指令,所以仍然应该有一些改进。

或者换一种说法,大多数优化是否位于运行代码或编译类的 VM 中?

请保存评论,因为 1.4 已经过时了,这个问题只是我想了两天的事情,在互联网上搜索并没有为我提供任何相当好的答案。

4

2 回答 2

6

javac编译器优化代码是一个常见的误解。它在 99% 的情况下都不会,并且主要是对您编写的字节码的内容进行字面翻译。

所有优化都在运行时的 JIT 中。这意味着为 JDK 1.0 编译的代码将在最新的处理器上运行,与遵循 Java 7 或 8 的最新更新的相同代码一样有效。

注意:编译器在计算编译时已知的常量时进行了少量优化。例如1+1=> 2 和"hello " + "world"=> “你好世界”。这些优化多年来并没有太大变化,它们在 Java 1.2 中就已经存在,可能更早。

编译你会得到一组以原始 1.4 VM 为目标的指令

自 Java 1.0 以来,Java 7 中只添加了一条字节码指令,而 Java 不使用它。添加它是为了支持在 JVM 上运行的动态语言。

在运行代码或编译类的 VM 中进行最多的优化

你可以假设它确实如此。Java 1.0 - 1.4 将使用 StringBuffer 进行字符串连接,而 Java 5.0+ 将使用稍微优化的 StringBuilder。差异很小(但可以测量)

请保存评论,因为 1.4 已经过时了,

Java 6 已经过时了,而 Java 8 将使 Java 7 看起来非常过时(当它最终在今年某个时候发布时)

于 2013-04-26T09:16:14.863 回答
-1

如果将目标指定为特定的 jdk 版本,则生成的字节码将不会被优化,但是,如果您碰巧在更高级的 vm 中运行此类文件/jar,那么它将更快地执行 JIT 编译和其他优化. 正如您所说,平台特定的优化将在 VM 端完成,因为更改字节码将导致 UnsupportedClassVersionError。

于 2013-04-26T08:52:50.550 回答