我想知道,当编译为java 1.4编写的java源代码时,-source和-target开关设置为1.4,是否会使用内置在两者之间的版本中的某些/任何优化。我的第一个意图是说当然不会,因为在编译之后,您会得到一组指令,这些指令的目标是原始的1.4 VM。然后我认为,既然编译器只是更聪明地使用指令,应该还有一些改进。
或者换句话说,大多数优化是在运行代码或编译类的VM中进行的吗?
请将1.4的评论保存为无可救药的过时,这个问题只是我想了两天的事情,现在搜索互联网并没有为我提供任何合理的好答案。
认为javac
编译器优化代码是一个常见的误解。在99%的情况下,它不会这样做,并且大多数情况下会将您所写的内容翻译为字节码。
所有的优化都在运行时的JIT中。这意味着在JDK 1.0上编译的代码将在最新的处理器上运行,与在Java 7或8的最新更新上编译的相同代码一样有效。
注意:编译器在计算编译时已知的常量时做了少量优化。例如,1+1
=> 2, "hello " + "world"
=> "hello world"。这些优化多年来没有太大变化,它们在Java 1.2中就存在了,可能更早。
编译时,你会得到一组指令,这些指令的目标是原始的1.4 VM
在Java 7中只添加了一个字节代码指令,因为Java 1.0和Java不使用它。添加它是为了支持在JVM上运行的动态语言。
在运行代码或编译类的VM中执行最多的优化
你可以假设它是。Java 1.0 - 1.4将使用StringBuffer进行字符串连接,而Java 5.0+将使用稍微优化的StringBuilder。差异非常小(但可测量)
请保存1.4已经过时的评论,
Java 6已经过时了,Java 8将使Java 7看起来非常过时(当它最终在今年某个时候发布时)
如果您将目标指定为特定的jdk版本,那么生成的字节码将不会被优化,但是,如果您碰巧在更高级的vm中运行这个类文件/jar,那么它将更快地执行JIT编译和其他优化。平台特定的优化将在VM端完成,因为更改字节码将导致UnsupportedClassVersionError。