2017-09-21 5 views
0

私は標準的なクイックソートアルゴリズムを実装し、いくつかの実行でそれをテストし、実行時間を配列に格納しました。System.nanoTime()は、QuickSortを何回実行しても連続的に減少する時間を返します。

int max = 100; 
int runs = 1000; 
int[] arr = new int[max]; 
Long[] times = new Long[runs]; 

while(n < runs){ 
     for(int i =0 ; i<max; i++){ 
     arr[i]=(int)(Math.random()*99); 
     //arr[i] = i; 
     } 

     Long start = System.nanoTime(); 
     quicksortsimple(arr,0,max-1); 
     Long now = System.nanoTime(); 

     times[n++] = now-start; 
    } 

次に何が起こるかは出力「回」配列は、はるかに大きな値で開始し、徐々に少なくと100番目のインデックス(クイックソートの100回の実行)した後、それはビット一定になるが、この値が1割未満であることです最初の2-3値の n = 1000で返される平均値は、プログラムの複数のルーンで同じです。

すでにソートされている(コメントアウトされた行として)配列を初期化しても、より平均的な時間がかかるはずですが、同じことが起こります。

しかし、これは、同じアレイ上の同じアルゴリズムに対してこのようなさまざまな実行時間を返してはなりません。どのような場合でも、減少するパターンは何を示していますか?

+1

https://stackoverflow.com/a/11227902/4467208 –

+1

ベンチマークに欠陥があることを示しています。https://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-ベンチマーク・イン・ジャンク – Kayaman

+0

'System.nanoTime()'によって返された数値がすべての反復で小さくなるわけではないので(時間を移動する必要はありません)、考えられる可能性が高いようです。彼らが一定の値で来るときにのみ測定値を使うことを提案します... – mumpitz

答えて

0

(以下の説明は、最後の細部への正確な、しかし何が起こっているかを理解するのに十分なされていません)

初めには、お使いのJREは(遅い)インタプリタモードでプログラムを実行し、そのホットスポットエンジンまでソートがスピードアップに値するものであることを検出し、ネイティブコンパイルされた翻訳を作成し、それが使用され、最初の反復の解釈されたコードよりもはるかに高速に実行されます。

+0

JREがモードを変更した点のいくつかの離散点セットがあったはずです。しかし、私は1000のtimes []配列を使用し、その結果はいくつかの浮き沈みによって連続的に減少します。これは何を意味するのでしょうか?何が起きているのかもっと詳しく教えてください。これはかなり興味深いようです。 –

+0

ホットスポットのコンパイルはパフォーマンスに影響を与える唯一の要因ではありませんが、しばしば最も顕著なものです。また、最適化は必ずしも1つのステップで行われるとは限りません。例えば。 'quicksortsimple()'メソッドの他に、かなり頻繁に呼ばれる 'Math.random()'があり、あなたの外側のループがあります。それらのそれぞれは独立したネイティブコンパイルの候補であり、最終的にHotspotエンジンはすべてを1つの大きなネイティブコードにインライン展開する可能性があります。また、HotspotのようなバックグラウンドタスクがCPUを消費しなくなったときに、プロセッサのキャッシュが頻繁にヒットするなど... –

関連する問題