考虑以下方法:
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编译器是否优化了额外变量的不必要定义,这是我为可读性和调试而设置的?
答案 0 :(得分:11)
Java编译器本身几乎不做任何优化。 JIT几乎可以做任何事情。
局部变量本身与优化有些无关 - 多运算符表达式仍然需要各种操作数逻辑进入堆栈,只是在未命名的“槽”中。您可能会发现两个实现的生成字节码非常相似,只是在第二种情况下没有名称。
更重要的是,可能偶尔发生的任何性能优势减少您使用的局部变量的数量几乎肯定是微不足道的。第一种方法的可读性好处更有可能是显着的。与往常一样,如果没有证据表明您尝试优化的地方是瓶颈,那么请避免微观优化,然后只允许优化证明的价值。
(当您证明您需要来优化特定方法时,您已经拥有了测试任何潜在优化的工具,因此您无需猜测。)< / p>
答案 1 :(得分:0)
代码不够大,无法针对初学者进行优化。而在第二种方式中,您只是保存用于存储numberOfLeadingZeros
和所有的引用的内存。
但是当您在运行时(例如至少10000次)使用此代码时,JIT会将其识别为HOT代码,然后使用方法内联和类似排序等巧妙的技巧对其进行优化。
但在你的情况下,首选选项是第一个,因为它更强可读。
您不应该为小优化而牺牲可读性。