我在尝试计算一些Java代码的执行时间,以便对Java的某些功能的效率或低效性有所了解。现在遇到了一些非常奇怪的问题,我完全无法解释。也许你们中的某个人可以帮助我理解它。
public class PerformanceCheck {
public static void main(String[] args) {
List<PerformanceCheck> removeList = new LinkedList<PerformanceCheck>();
int maxTimes = 1000000000;
for (int i=0;i<10;i++) {
long time = System.currentTimeMillis();
for (int times=0;times<maxTimes;times++) {
// PERFORMANCE CHECK BLOCK START
if (removeList.size() > 0) {
testFunc(3);
}
// PERFORMANCE CHECK BLOCK END
}
long timeNow = System.currentTimeMillis();
System.out.println("time: " + (timeNow - time));
}
}
private static boolean testFunc(int test) {
return 5 > test;
}
}
开始这个操作将导致相对较长的计算时间(请记住removeList为空,因此testFunc甚至不会被调用):
time: 2328
time: 2223
...
虽然将 removeList.size() > 0 和 testFunc(3) 的任何组合替换为其他内容具有更好的效果。例如:
...
if (removeList.size() == 0) {
testFunc(3);
}
...
结果为(每次都会调用testFunc):
time: 8
time: 7
time: 0
time: 0
即使将这两个函数独立调用,也会导致更低的计算时间:
...
if (removeList.size() == 0);
testFunc(3);
...
结果:
time: 6
time: 5
time: 0
time: 0
...
只有在我最初的示例中,这种特定组合需要如此长的时间。 这让我感到烦恼,我真的很想了解它。 它有什么特别之处?
谢谢。
补充:
更改第一个示例中的testFunc()
if (removeList.size() > 0) {
testFunc(times);
}
转换为其他东西,例如
private static int testFunc2(int test) {
return 5*test;
}
会导致再次变得快速。
size()
函数的作用不重要。这两段代码片段都具有相同的调用方式。精度不重要。这些 JVM 标志不重要。通过 IDE 运行也不重要。这里没有 GC 问题。 - Sean Owen