私はいくつかのJava 8 Stream
APIを使って作業していました。私はちょうどStream
の内容を印刷している以下の2つのソリューションのパフォーマンスの違いを見るのは混乱しています。System.out :: printlnがJava 8の匿名クラス実装より遅いのはなぜですか?
解決方法1:
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
start = System.nanoTime();
Arrays.stream(array).forEach(System.out::println);
System.out.println((System.nanoTime() - start)/1000000.0f);
解決方法2:実行のために
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
start = System.nanoTime();
Arrays.stream(array).forEach(new IntConsumer() {
@Override
public void accept(int value) {
System.out.println(value);
}
});
System.out.println((System.nanoTime() - start)/1000000.0f);
、Solution 1
が約取っています。 Solution 2
より5〜6倍多くなります。
システム構成:
- JRE:
1.8.0_101 64 bit
- OS:
Windows 10 Home 64-bit
- RAM:
4 GB
- IDE:
Eclipse Mas-1 for Java EE 64-bit
誰かが説明できる場合には参考になります、なぜですか? eはこの大きな違いですか?
JMHコード:
public class MyBenchmark {
@Benchmark
public void solution_0() {
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);asdasdas
}
}
@Benchmark
public void solution_1() {
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
Arrays.stream(array).forEach(new IntConsumer() {
@Override
public void accept(int value) {
System.out.println(value);
}
});
}
@Benchmark
public void solution_2() {
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
Arrays.stream(array).forEach(System.out::println);
}
}
どのように測定していますか? 1回だけ走っていますか?マイクロベンチマークは簡単ではありません。ウォームアップ、最高値と最低値の破棄、平均値と標準偏差などを考慮する必要があります。 –
Javaのマイクロベンチマークについては、どの方法が高速であるかを知る前に覚えておく必要があります。 Jmhを検索する –
@FedericoPeraltaSchaffner私は100回の反復でそれを取り上げ、大きな変更を加えていた最初のいくつかの要素をスキップしました。私は同じプログラムを4〜5回実行し、毎回の結果は同じでした。 –