2009-04-23 19 views
8

HttpWebResponse.GetResponseStream()のストリームに使用する最適なバッファサイズはどれくらいですか?HttpWebResponseの応答ストリームの最適なバッファサイズ

オンラインの例は256bから5KBほどです。何がありますか?私は、バッファサイズが状況によると思われる。もしそうなら、どのようなタイプのバッファサイズを使用するのか?

ありがとうございました。

答えて

6

本当に大したことではありません。

本当に小さなバッファを使用している場合は、レイヤーをいくつか追加してバイトを取得しなければならない場合があります(ストリームは少なくともバッファリングを行う可能性がありますが、デフォルトは)。そして、本当に大きなバッファを使用すると、メモリが浪費され、断片化が発生します。あなたが明らかにここでIOを行っているので、バッファを調整することでいつでもIO時間が支配的になるでしょう。

一般的に、私は2048(2k)と8192(8k)の間で2の累乗を使います。 85,000バイト以上のバッファ(それは"large object" and subject to different GC rulesです)を使用すると、あなたが何をしているのか分かります。

実際、バッファサイズよりも重要なのは、それを保持する時間です。ラージオブジェクトヒープ以外のオブジェクトの場合、非常に短命のオブジェクト(Gen 0コレクションは高速)または非常に長寿命のオブジェクト(Gen 2)を処理する上でGCは非常に優れています。解放される前にGen 1または2に到達するのに十分な長さのオブジェクトは、比較的高価で、通常、バッファの大きさよりも心配する時間があります。

最後に、使用しているバッファのサイズのためにパフォーマンスの問題があると思われる場合は、テストです。それは起こりそうもないかもしれませんが、OSのバージョン、ネットワークハードウェア、および特定のサイズのバッファで奇妙な問題があるドライバリリースの奇妙なコンフルエンスがあるかもしれません。

+1

非常に便利な投稿ですが、8192を意味すると思いますか? 2の累乗 - > 2048,4096,8192(8k)。 – Derrick

3

私が経験したことは、実際にあなたがやっていることに依存していますが、通常1024-4096バイト(1-4 KBの別名2の桁)の範囲のものは、私が見た "最高"の数字)。

基本的には、ストリームからデータを不必要に読み込むのではなく、戻り値を小さくするほどのバッファを必要としません。バッファーが大きすぎると(〜MB)、メモリー・キャッシュ・ミスが増えます。実際にはパフォーマンスが低下する可能性があります。もちろん、これは実際のH/W(バス速度、キャッシュサイズなど)に基づいて大きく変わりますが、4MBのバッファが4KBのバッファよりも遅い場合があります(どちらも長い寿命です。問題)。

早すぎる最適化を試す前に、現在の実装をテストしてください。

2

実際には、バッファサイズが小さすぎると問題が発生しています。私はそれをテストし、バッファサイズを小さな値に設定してはならないことを検証しました。私の例では、私は2048に設定し、ダウンロードはFirefox 1に比べて非常に遅くなっています(Firefox 1はダウンロードセグメンテーションなしで、私と同じです)。

大きなサイズ409600に設定した後、ダウンロードがかなり高速になりました。余分なコールでオーバーヘッドがかかり、ダウンロードが遅くなると思います。おそらくネットワークレベルでは、バッファがバッファサイズを超えているので、TCPはパッケージを再送するように要求する必要がありますか? (ちょっと推測すると、私はTCPの仕組みがわからないので)、バッファサイズが小さいため、ダウンロードが遅くなることは間違いありません。私はfirefoxのデフォルトのダウンロード(追加とsegmenetationなしで)を使用して実行し、私のクラスを使用して、それをテストして、両方があまりにも異なっています。

ここでループが繰り返されるたびに、はるかに高速です。ここでの接続は静かですが、2つのスレッドを実行した後には、はるかに遅くなり、おそらく共有する必要があるため200,000バイト(200Kb)別のスレッド。

+0

大きなファイル(2Gb)をアップロードする場合も同じように私に起こりました。 –

関連する問題