我制作了这样的基准:
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毫秒!!!
那么,为什么第一个代码块如此慢? 我是中国人。抱歉我的英语不好!
答案 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次时,整个方法在后台编译,这样当第二个和第三个循环运行时它们就被删除了。
测试这个的一个简单方法是更改循环的顺序或更好地将每个循环放在它自己的方法中以停止它。