37

この投稿の前に、1 つの注意をさせてください。Javaに関しては全くの初心者です。しばらくの間、PHP のオンとオフをプログラミングしてきましたが、デスクトップ アプリケーションを作成する準備ができていたので、さまざまな理由で Java を使用することにしました。

私が取り組んでいるアプリケーションは初期段階 (5 クラス未満) にあり、ローカル ファイルからバイトを読み取る必要があります。通常、ファイルは現在 512kB 未満です (ただし、将来的に大きくなる可能性があります)。現在、FileInputStreamファイルを 3 バイト配列に読み込むために a を使用しています。これは私の要件を完全に満たしています。ただし、言及されているのを見て、BufferedInputStream現在これを行っている方法が最適かどうか、または a も使用する必要があるかどうか疑問に思っていBufferedInputStreamました。

私はいくつかの調査を行い、Stack Overflow に関するいくつかの質問を読みましたが、BufferedInputStream. 私の状況では、バイトを読み取った最初の配列はほんの数バイト (20 未満) です。受け取ったデータがこれらのバイトで適切であれば、残りのファイルをさまざまなサイズのさらに 2 つのバイト配列に読み込みます。

また、多くの人が特定のケースでどちらがより効率的かを確認するためにプロファイリングについて言及していると聞いていますが、私はプロファイリングの経験がなく、どこから始めればよいかよくわかりません。これについてもいくつかの提案が欲しいです。

とても長い投稿で申し訳ありませんが、これらのことを行うための最良の方法を学び、理解したいと思っています. 私は常に自分の決定を二番目に推測する悪い癖があるので、フィードバックをいただければ幸いです. ありがとう!

4

5 に答える 5

84

一貫して小さな読み取りを行っている場合は、BufferedInputStreamパフォーマンスが大幅に向上します。バッファリングされていないストリームに対する各読み取り要求は、通常、要求されたバイト数を読み取るためのオペレーティング システムへのシステム コールになります。システム コールを実行するオーバーヘッドは、syscall ごとに数千のマシン命令になる場合があります。バッファリングされたストリームは、(たとえば) 8k バイトまでの大きな読み取りを内部バッファに 1 回実行し、そのバッファからバイトを渡すことでこれを減らします。これにより、システムコールの数を大幅に削減できます。

ただし、大量の読み取り (たとえば 8k 以上) を一貫して行っている場合は、BufferedInputStream処理が少し遅くなります。通常、syscall の数を減らすことはなく、バッファリングによって追加のデータ コピー ステップが発生します。

あなたのユースケース (最初に 20 バイトのチャンクを読み取り、次に多くの大きなチャンクを読み取る場合) では、を使用するBufferedInputStreamと、パフォーマンスが向上するよりも低下する可能性が高くなります。しかし、最終的には、実際の読み取りパターンに依存します。

于 2010-06-26T02:57:40.310 に答える
5

比較的大きな配列を使用してデータを一度にチャンクで読み取るとBufferedInputStream、無駄なコピーが発生するだけです。(read必ずしもすべての配列を読み取るとは限らないことに注意してください-必要になる場合がありますDataInputStream.readFully)。勝つ場所BufferedInputStreamは、小さな読み取りをたくさん行うときです。

于 2010-06-26T02:24:34.463 に答える
1

BufferedInputStream は、事前に必要なファイルをさらに読み取ります。私が理解しているように、1つの大きな連続ディスク読み取りとタイトループでの多くの読み取りのように、事前により多くの作業を行っています。

プロファイリングに関しては、netbeans に組み込まれているプロファイラーが気に入っています。始めるのは本当に簡単です。:-)

于 2010-06-26T02:20:47.503 に答える
1

プロファイリングについて話すことはできませんが、Java アプリケーションを開発した経験から、バッファ クラス (BufferedInputStream、StringBuffer) のいずれかを使用すると、アプリケーションが非常に高速になることがわかりました。そのため、最小のファイルや文字列操作にも使用します。

于 2010-06-26T02:21:09.730 に答える