10

私はバイナリファイルを読んでいますが、ここにサンプルがあります:

public static byte[] ReadFully(Stream input)
{
    byte[] buffer = new byte[16*1024];
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        ......
    }

}

明らかに、バッファー サイズ (16*1024) がパフォーマンスに大きく影響します。I/Oテクノロジー(SATASSDSCSIなど)と、ファイルが存在するパーティションのフラグメントサイズ(パーティションのフォーマット中に定義できます)に依存することを読みました。

しかし、ここで質問 があります。バッファ サイズを定義する公式またはベスト プラクティスはありますか? 現在、試行錯誤しながら定義しています。

編集: サーバーでさまざまなバッファー サイズを使用してアプリケーションをテストしたところ、4095*256*16 (16 MB) で最高のパフォーマンスが得られました!!! 4096 は 4 秒遅くなります。

非常に役立ついくつかの古い投稿を次に示しますが、その理由はまだわかりません。

4

2 に答える 2

7

Sequential File Programming Patterns and Performance with .NET」は、I/O パフォーマンスの改善に関する優れた記事です。

このPDF ファイルの 8 ページでは、8 バイトを超えるバッファ サイズの帯域幅が一定であることを示しています。記事が 2004 年に書かれたもので、ハードディスク ドライブが「Maxtor 250 GB 7200 RPM SATA ディスク」であると考えてください。結果は、最新の I/O テクノロジによって異なるはずです。

最高のパフォーマンスを探している場合は、pinvoke.netまたは PDF ファイルの 9 ページを参照してください。バッファリングされていないファイルのパフォーマンス測定値は、より良い結果を示しています。

バッファリングされていない I/O では、ディスク データはアプリケーションのアドレス空間とデバイスの間を直接移動し、途中でコピーすることはありません。

概要

  • 単一ディスクの場合は、.NET フレームワークのデフォルトを使用します。これらは、シーケンシャル ファイル アクセスで優れたパフォーマンスを発揮します。
  • ファイルの作成時に (SetLength() メソッドを使用して) 大きなシーケンシャル ファイルを事前に割り当てます。これにより、通常、断片化されたファイルと比較して速度が約 13% 向上します。
  • 少なくとも現時点では、ディスク アレイで最高のパフォーマンスを実現するには、バッファなしの I/O が必要です。バッファありの I/O は、バッファなしの I/O よりも 8 倍遅くなる可能性があります。この問題は、.NET フレームワークの今後のリリースで解決される予定です。
  • 独自のバッファリングを行う場合は、大きなリクエスト サイズを使用します (64 KB から始めるのが適切です)。.NET フレームワークを使用すると、シングル プロセッサは、バッファリングされていない I/O を使用して 800 MB/秒を超える速度でディスク アレイを読み書きできます。
于 2013-11-07T13:29:18.727 に答える
4

最適または最悪のバッファー サイズはありませんが、いくつかの側面を確認する必要があります。

C# を使用しているため、Windows で実行すると、Windows はNTFSを使用し、そのページ サイズは 4 MB であるため、4096 の倍数を使用することをお勧めします16*1024 = 4*4096。それは16*4096私たちが言うことができないよりも良いか悪いかです。

すべては、状況とプログラムの要件によって異なります。ここで、最良のオプションを選択することはできませんが、より良いオプションのみを選択することを忘れないでください。を使用することをお勧めしますが、独自の を使用することも4096できますが、このバッファーはヒープに割り当てられるため、割り当てに時間がかかるため、たとえば.4*409616*4096128*4096

于 2013-10-24T06:30:12.367 に答える