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

長い変数に時間がかかるのではないかと思うので、次のようなテストを行います。

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

たった1ミリ秒かかります!!!

では、なぜ最初のコードブロックがとても遅いのですか?私は中国人です。英語が下手でごめんなさい!

4

2 に答える 2

8

それは、ベンチマークの実行方法に大きく依存します。JVM は実際にはコードを実行していないため、1 ミリ秒未満の実行になる可能性が最も高くなります。コードが使用されていないと判断され、スキップされます。

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

と同等です

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

JVM はおそらく 2 番目のバージョンを実行しています。

Java でマイクロ ベンチマークを作成する方法を読むか、 caliperなどのベンチマーク ライブラリを使用する必要があります。

于 2012-08-29T09:12:14.090 に答える
1

コードが役に立たないことを JIT が検出するには時間がかかります。コードが複雑になるほど、時間がかかります (または、まったく検出されない可能性があります)。

2 番目と 3 番目のケースでは、コードを何も置き換えることができません (コードを 100 倍長くしても、それ以上は実行されないのではないかと思います)。


もう 1 つの可能性は、3 つのテストすべてを同じメソッドで実行していることです。最初のループが 10,000 回以上繰り返されると、メソッド全体がバックグラウンドでコンパイルされ、2 番目と 3 番目のループが実行されたときにそれらが削除されます。

これをテストする簡単な方法は、ループの順序を変更するか、各ループを独自のメソッドに配置してこれを停止することです。

于 2012-08-29T09:12:29.913 に答える