2010-12-14 19 views
5

バイナリファイルを読み込んでいるコードをプロファイリングしていました。ロード時間は約15秒でした。JavaのBufferedInputStreamの最適サイズを調べる

ロード時間の大部分は、バイナリデータをロードしていたメソッドからのものでした。

私は私のDataInputStreamを作成するには、次のコードを持っていた:

is = new DataInputStream(
    new GZIPInputStream(
    new FileInputStream("file.bin"))); 

そして、私はこれにそれを変更:

is = new DataInputStream(
    new BufferedInputStream(
    new GZIPInputStream(
    new FileInputStream("file.bin")))); 

を、私はこの小さな変更をしたので、後にロードするコードは、15秒から行ってきました4.

しかし、私は、BufferedInputStreamに2つのコンストラクタがあることを発見しました。もう一方のコンストラクタでは、バッファサイズを明示的に定義できます。

私は2つの質問を持っている:

にBufferedInputStreamに選ばれ、それが理想的ですどのサイズ
  1. ?そうでない場合は、どのようにバッファの最適なサイズを見つけることができますか?バイナリ検索を行うコードをすばやく書くべきですか?
  2. これはBufferedInputStreamを使用する最も良い方法ですか?私はもともとGZIPInputStream内にそれを持っていたが、無視できる利益があった。私はコードが今何をしているのかは、ファイルバッファを満たす必要があるたびに、GZIP入力ストリームが通過し、xバイト(xはバッファのサイズ)をデコードすると仮定しています。 GZIPInputStreamを完全に省略するだけの価値はありますか?それは間違いなく必要ですが、私のファイルサイズは使用時に劇的に減少します。

答えて

8

GZIPInputStreamとBufferedInputStreamの両方が内部バッファを使用します。そのため、GZIPInputStream内でBufferedInputStreamを使用しても何の利点もありません。 GZIPInputStreamの問題は、生成する出力をバッファしないため、現在のバージョンがはるかに高速です。

BufferedInputStreamのデフォルトのバッファサイズは8kbなので、それを試したり増やしたりして、効果があるかどうかを確認できます。私は正確な数が重要であることを疑うので、あなたは単純に2倍または2で割ることができます。

ファイルが小さい場合は、完全にバッファリングすることもできます。これはあなたに理論上最高のパフォーマンスを与えるはずです。 GZIPInputStreamのバッファサイズ(デフォルトは512バイト)を増やすこともできます。ディスクからの読み込みが高速になるためです。

+0

ディスクから読み込むときに、GZIPInputStreamに64Kのバッファを試すことをお勧めします。私は1 MBを使用しています。これは必要以上に多い可能性があります。 ;) –

4
  1. コード化されたバイナリ検索を気にしないでください。手でいくつかの値を試してみて、タイミングを比較してください(好きな場合は手動バイナリ検索ができます)。ほとんどの場合、非常に広い範囲のバッファサイズが最適なパフォーマンスに近づくので、そのトリックを最小限に抑えることができます。あなたが持っているもの

  2. が正しい順序である:

    is = new DataInputStream(
        new BufferedInputStream(
        new GZIPInputStream(
        new FileInputStream("file.bin")))); 
    

    後者はすでにその入力バッファ以来GZIPInputStream内部BufferedInputStreamを置くことにはほとんど意味がありません

    の削除(ただし、出力を。) GZIPInputStreamは勝利する可能性がありますが、データをディスクから読み込み、ファイルシステムのキャッシュに常駐していない場合は、パフォーマンスに悪影響を与えます。その理由は、ディスクからの読み込みが非常に遅く、解凍するgzipは非常に高速です。したがって、ディスクからより少ないデータを読み込み、ディスクからより多くのデータを読み出すよりも、メモリ内のデータを解凍する方が一般的に安いです。

+0

あなたの洞察に感謝します。 – Brad

+0

ようこそ。私はちょっとした情報で答えを編集しました。 – NPE

関連する問題