バイナリ ファイルをロードしているコードをプロファイリングしていました。ロード時間は約15秒でした。
ロード時間の大半は、バイナリ データをロードするメソッドによるものでした。
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 つのコンストラクターがあることがわかりました。もう 1 つのコンストラクターを使用すると、バッファー サイズを明示的に定義できます。
2 つの質問があります。
- BufferedInputStream で選択されたサイズはどれくらいですか?それは理想的ですか? そうでない場合、バッファーの最適なサイズを見つけるにはどうすればよいですか? 二分探索を行う簡単なコードを書く必要がありますか?
- これは BufferedInputStream を使用できる最良の方法ですか? 私はもともと GZIPInputStream 内にそれを持っていましたが、ごくわずかな利益しかありませんでした。私は、コードが現在行っていることは、ファイル バッファーがいっぱいになる必要があるたびに、GZIP 入力ストリームが通過し、x バイト (x はバッファーのサイズ) をデコードすることであると想定しています。GZIPInputStream を完全に省略するだけの価値はありますか? 絶対に必要というわけではありませんが、使用するとファイル サイズが劇的に減少します。