2012-02-16 1 views
0

バイナリファイルをある場所から別の場所に保存するのにどれくらいの時間がかかっているかをベンチマークしようとしています。高い変動を出力するマイクロベンチマーク

FileInputStream fis = new FileInputStream("/path/to/binary/file"); 
    BufferedInputStream in = new BufferedInputStream(fis); 

    FileOutputStream fos = new FileOutputStream("/path/to/save/new/binary/file"); 
    BufferedOutputStream out = new BufferedOutputStream(fos); 

    long before = System.currentTimeMillis(); 
    int data = 0; 

    while ((data = in.read()) != -1) { 
     out.write(data); 
    } 

    in.close(); 
    out.close(); 

    int seconds = (int) (System.currentTimeMillis() - before/1000) % 60; 

    System.out.println("Took " + seconds); 

バッファ付きまたはバッファなしの出力は、3〜64 msです。私は40-50、10-20、30-40といったもっと近い範囲を期待していたでしょう。この高い変動の原因は何ですか?

答えて

2

特にシステムコールとファイルI/Oが含まれている場合は、単一のテストのみを実行して結果の一貫性を期待することはできません。

以下の手順で測定値の意味を改善してください。

  • タイミングごとに複数のテストを実行します。
  • System#nanoTime()を使用して測定してください。
+0

nanoTimeを使用すると、currentTimeMillisと同じ結果が得られます。だから私は複数のテストを実行し、そこから平均を取得する必要があります。 –

0

は、ファイルI/Oは関与「ランダム」がたくさん持つことができます:IOスケジューラはあなたの要求に対処することを決定するまで、あなたは基本的に待っているので、これはシステムコールである

  • それは他のいくつかのプロセスが重いIをやっても
  • 高速でメモリ、(ER)にキャッシュすることができる
  • からの読み込みに時間がかかり、ハードドライブ、上にあってもよい
  • /O
  • いくつかの他のプロセスは、これに対処する方法については、cheekenさんの提案で、CPU

ルックを独占することができます。

+2

火曜日、月が衰えている可能性があります、アイスクリームトラックが通りを運転している可能性があります。これらのすべてがマイクロベンチマークに影響するようです。そして、これまで2月29日にテストを実行したことはありません.4年に1回しか複製できません。仕事を複製しようとしている他の人たちにはそれはまったく考えられません。 –

+0

2月29日くらいのことはちょうど古い妻の話です。経験豊富なプログラマーは、最適なパフォーマンスを得るためには、システムクロックを永続的に2月29日に設定することを知っています:) – emory

関連する問題