为什么“long var = System.nanoTime()”和“System.nanoTime()”在使用时间如此不同?

时间:2012-08-29 09:09:50

标签: java

我制作了这样的基准:

for (int i = 0; i < 1000 * 1000; ++i) {
    long var = System.nanoTime();
}

我的电脑用jdk6.0需要41毫秒

以下代码仅花费1毫秒!!!

for (int i = 0; i < 1000 * 1000; ++i) {
    System.nanoTime();
}

我想可能是因为长时间变成了时间,所以我做了这样的测试:

 for (int i = 0; i < 1000 * 1000; ++i) {
    long var = i;
}

只需1毫秒!!!

那么,为什么第一个代码块如此慢? 我是中国人。抱歉我的英语不好!

2 个答案:

答案 0 :(得分:8)

这实际上取决于您如何运行基准测试。你最有可能得到&lt; 1ms运行因为JVM没有真正运行你的代码:它确定代码没有被使用并跳过它:

for (int i = 0; i < 1000 * 1000; ++i) {
    long var = i;
}

相当于

//for (int i = 0; i < 1000 * 1000; ++i) {
//    long var = i;
//}

并且JVM可能正在运行第二个版本。

您应该阅读how to write a micro benchmark in Java或使用基准库,例如caliper

答案 1 :(得分:1)

JIT需要时间来检测您的代码没有做任何有用的事情。代码越复杂,花费的时间越长(或者根本无法检测到它)

在第二种和第三种情况下,它可以用任何东西替换代码(我怀疑你可以使它长100倍而且不再运行)


另一种可能性是你在同一个方法中运行所有三个测试。当第一个循环迭代次数超过10,000次时,整个方法在后台编译,这样当第二个和第三个循环运行时它们就被删除了。

测试这个的一个简单方法是更改​​循环的顺序或更好地将每个循环放在它自己的方法中以停止它。