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

Ada*_*tan 7 java variables optimization

请考虑以下方法:

private static long maskAndNegate(long l) {
    int numberOfLeadingZeros = Long.numberOfLeadingZeros(l)
    long mask = CustomBitSet.masks[numberOfLeadingZeros];
    long result = (~l) & mask;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

该方法可以缩写为:

private static long maskAndNegate(long l) {
    return (~l) & CustomBitSet.masks[Long.numberOfLeadingZeros(l)];
}
Run Code Online (Sandbox Code Playgroud)

这两个表示在实际运行时间是否相等?换句话说,Java编译器是否优化了额外变量的不必要定义,我已将其置于可读性和调试之中?

Jon*_*eet 11

Java编译器本身几乎不做任何优化.这是几乎所有事情的JIT.

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

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

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