2016-10-17 13 views
1

私たちは最初とその後の実行間の時間撮影した違いを見ることができIntel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz (2 CPUs), ~2.7GHzJava8ストリーム操作がキャッシュされていますか?

String format = "%7s run taken %6d micro seconds %5d findAny"; 

    // First run 
    long start = System.nanoTime(); 
    int rand = IntStream.range(0, 100000).parallel().findAny().getAsInt(); 
    long end = System.nanoTime(); 
    System.out.println(String.format(format, "First", ((end - start)/1000), rand)); 

    // Subsequent runs 
    for (int i = 0; i < 25; i++) { 
     start = System.nanoTime(); 
     rand = IntStream.range(0, 100000).parallel().findAny().getAsInt(); 
     end = System.nanoTime(); 
     System.out.println(String.format(format, "Subseq", ((end - start)/1000), rand)); 
    } 

と、その出力

First run taken 92532 micro seconds 50000 findAny 
Subseq run taken  61 micro seconds 50000 findAny 
Subseq run taken  37 micro seconds 50000 findAny 
Subseq run taken  52 micro seconds 50000 findAny 
Subseq run taken  42 micro seconds 50000 findAny 
Subseq run taken  33 micro seconds 50000 findAny 
Subseq run taken  32 micro seconds 50000 findAny 
Subseq run taken  34 micro seconds 50000 findAny 
Subseq run taken  33 micro seconds 50000 findAny 
Subseq run taken  34 micro seconds 50000 findAny 
Subseq run taken  32 micro seconds 50000 findAny 
Subseq run taken  32 micro seconds 50000 findAny 
Subseq run taken  46 micro seconds 50000 findAny 
Subseq run taken  36 micro seconds 50000 findAny 
Subseq run taken  31 micro seconds 50000 findAny 
Subseq run taken  43 micro seconds 50000 findAny 
Subseq run taken  34 micro seconds 50000 findAny 
Subseq run taken  31 micro seconds 50000 findAny 
Subseq run taken  32 micro seconds 50000 findAny 
Subseq run taken  37 micro seconds 50000 findAny 
Subseq run taken  45 micro seconds 50000 findAny 
Subseq run taken  49 micro seconds 50000 findAny 
Subseq run taken  32 micro seconds 50000 findAny 
Subseq run taken  31 micro seconds 50000 findAny 
Subseq run taken  31 micro seconds 50000 findAny 
Subseq run taken  37 micro seconds 50000 findAny 

を実行している私のPCのサンプルコードの下に走りました。

  1. これはストリーム操作がキャッシュされていることを意味しますか? Java8のストリーム用に実装された内部キャッシュはありますか?
  2. 時々findAny戻り、別の値が、かかった時間は、後続の実行にほぼ等しい最初の実行が好きではありませ

First run taken 84099 micro seconds 50000 findAny 
Subseq run taken 163 micro seconds 25000 findAny 
Subseq run taken  46 micro seconds 50000 findAny 
Subseq run taken  52 micro seconds 25000 findAny 

答えて

1

下記参照それはストリーム操作がキャッシュされている意味ですか?

いいえ、lambdaを実装するために生成されたコードと、読み込まれたクラスがキャッシュされます。

Java8のストリーム用に実装された内部キャッシュはありますか?

Streamsには特別なキャッシュはありません。

は時々findAnyは異なる値を返すが、かかる時間は、実際に最初のラン

を好まない後続の実行にほぼ等しいです。結果については何もキャッシュされません。最初にコードを読み込むためのペナルティを支払う。

ところで、少なくとも10,000回実行されるまで、コードは実際に最適化されていません。私はそれを計時する前に約10秒間このテストを繰り返し実行します。

+0

同じコードを10秒間隔で実行し、その後の実行には300〜400マイクロ秒がかかりました。 – Saravana

+0

@Saravanaは、複数のスレッドを使用するとオーバーヘッドが増える点に注意しています。私は比較のためにparallel()を使わないで同じテストを試みます。 –

+0

@サラバナあなたはそれのコピーですコードではなく、同じコード行を呼び出す必要があります。同じように見えるすべてのコードを最適化するわけではなく、実際には同じ行にする必要があります。最初の20000回の反復の結果を無視して、それ以降の結果のみを出力するループを使用することをお勧めします。 –

関連する問題