说我有一个用于例如方法isEven
验证特定值,的方法第二个方法调用例如从磁盘或用户)。但在那之后我还需要偶数值的方法使用此方法:JIT编译器的优化:</p> <pre><code>public static boolean isEven(int evenSize) { return evenSize % 2 == 0; } </code></pre> <p>我用这种方法来验证外部输入(:用相同的参数
public static String padToEven(int evenSize, String string) {
if (!isEven(evenSize)) { // <-- duplication of isEven method
throw new IllegalArgumentException("evenSize argument is not even");
}
if (string.length() >= evenSize) {
return string;
}
StringBuilder sb = new StringBuilder(evenSize);
sb.append(string);
for (int i = string.length(); i < evenSize; i++) {
sb.append('x');
}
return sb.toString();
}
所以基本上我们提供已经验证参数的padToEven()
和参数使用相同isEven
功能验证。 JIT编译器(比如在Java的第8版中)能够找到第二个调用并优化它吗?
你可以假设检查不依赖于动态值(即,它是确定于所提供的参数值)。它也没有任何除返回值之外的副作用,例如日志记录。
显然,对于'isEven'而言,这并不重要,但例如, 'isPrime'在操作上的差异可能是显着的,特别是在循环内使用时。 –
有趣的问题!然而,我怀疑这是否可以在一般情况下安全地确定这种重用。 –
@BoristheSpider是的,可能会非常棘手。对于JIT编译器(副作用,状态)和调用而言,很多未知数都可能被相当多的字节代码分隔开来。 –