17

私の Java プログラムは、いくつかのファイルを読み取ることにほとんどの時間を費やしています。たとえば、同時実行、プリフェッチ、メモリ マップ ファイルなどを使用して最適化したいと考えています。

ベンチマークなしで最適化するのはナンセンスなので、ベンチマークします。ただし、ベンチマーク中は、実際の実行とは異なり、ファイル コンテンツ全体が RAM にキャッシュされます。したがって、ベンチマークの実行時間ははるかに短く、おそらく現実とは無関係です。

ファイルの内容をキャッシュしないように OS (Linux) に何らかの方法で指示するか、各ベンチマークを実行する前にキャッシュを消去する必要があります。または、使用可能な RAM (32 GB) のほとんどを消費して、ファイル コンテンツのごく一部しか収まらないようにすることもできます。

ベンチマークにキャリパーを使用していますが、この場合は必要ないと思います (決してマイクロベンチマークではありません)。それが良いアイデアかどうかもわかりません。

4

2 に答える 2

5

Linux ファイル キャッシュをクリアする

sync && echo 1 > /proc/sys/vm/drop_caches

すべての RAM を使用する大きなファイルを作成する

dd if=/dev/zero of=dummyfile bs=1024 count=LARGE_NUMBER

(完了したら削除することを忘れないでくださいdummyfile)。

于 2012-07-23T10:07:16.347 に答える
2

非常に大きなファイルを作成してから削除できます。これにより、ディスク キャッシュがクリアされます。

パフォーマンスをテストする別の方法は、メイン メモリよりも大きいファイルを読み取ることです。

いずれにせよ、テストしているのはハードウェアのパフォーマンスです。これを改善するには、ハードウェアを改善する必要があります。ソフトウェアでできることは限られています。たとえば、複数のスレッドを使用してもディスクの回転は速くなりません。;)


Windows NT http://research.microsoft.com/pubs/68479/seqio.doc

シーケンシャル スキャンを実行する場合、NT は 64KB のプリフェッチ要求を行います。

Linux からhttp://www.ece.eng.wayne.edu/~sjiang/Tsinghua-2010/linux-readahead.pdf

シーケンシャル プリフェッチ (Linux では先読みとも呼ばれる) は、ストレージ デバイスの特性とアプリケーションによる非効率的な使用方法との間の大きなギャップを埋めるために広く採用されている手法です。

于 2012-07-23T10:05:02.940 に答える