是否优化后使用的变量定义?

考虑以下方法:

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。

局部变量本身与优化有些无关 – 多运算符表达式仍然需要逻辑上各种操作数进入堆栈,只是在未命名的“槽”中。 您可能会发现两个实现的生成字节码非常相似,只是在第二种情况下没有名称。

更重要的是,通过减少您使用的局部变量的数量偶尔 可能出现的任何性能优势几乎肯定是微不足道的。 第一种方法的可读性好处更有可能是显着的。 与往常一样,在没有证据表明您尝试优化的地方是瓶颈的情况下,避免微观优化,然后只允许优化已certificate其价值的优化。

(当您certificate需要优化特定方法时,您已经拥有了测试任何潜在优化的工具,因此您无需猜测。)

代码不够大,无法针对初学者进行优化。 在第二种方式中,您只是保存用于存储numberOfLeadingZeros和所有引用的内存。

但是当您在运行时(例如至少10000次)使用此代码时,JIT会将其识别为HOT代码,然后使用方法内联和类似排序等简洁技巧对其进行优化。

但在你的情况下, 首选的选项是第一个,因为它更具可读性

您不应该为小优化而牺牲可读性。