【发布时间】:2012-11-29 08:07:28
【问题描述】:
考虑以下方法:
private static long maskAndNegate(long l) {
int numberOfLeadingZeros = Long.numberOfLeadingZeros(l)
long mask = CustomBitSet.masks[numberOfLeadingZeros];
long result = (~l) & mask;
return result;
}
方法可简写为:
private static long maskAndNegate(long l) {
return (~l) & CustomBitSet.masks[Long.numberOfLeadingZeros(l)];
}
这两种表示在实际运行时是否相等?换句话说,Java 编译器是否优化掉了我为了可读性和调试而放置的额外变量的不必要定义?
【问题讨论】:
-
哪个 Java 编译器?哪个 JIT 编译器?哪个平台?换句话说,获得与你相关的答案的唯一可靠方法是自己测试。没那么难。
-
"Java 编译器是否优化..." 在大多数情况下,编译器不会优化任何东西,iirc。 HotSpot 技术可能会对其进行优化,这可能是您应该研究的。
-
大多数(如果不是全部)Java 编译器都进行了一些优化。我会将 Oracle、GNU(也许还有 Eclipse)所做的任何优化作为标准。 en.wikipedia.org/wiki/Java_compiler#Major_Java_compilers
-
编译两个版本。然后使用
javap工具(JDK自带)反汇编类文件(使用javap的-c选项)。比较字节码,看看有什么区别。
标签: java variables optimization