2

我做了一个这样的基准:

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();
}

我认为可能是 long var 花费了时间,所以我进行了这样的测试:

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

只需1毫秒!!!

那么,为什么第一个代码块这么慢?我是中国人。对不起我的英语不好!

4

2 回答 2

8

这实际上取决于您如何运行基准测试。你最有可能得到 <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 可能正在运行第二个版本。

您应该阅读如何用 Java 编写微基准测试或使用基准测试库,例如caliper

于 2012-08-29T09:12:14.090 回答
1

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

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


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

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

于 2012-08-29T09:12:29.913 回答