2012-01-20 2 views
0

私はC#でGETリクエストを行い、解析するページをダウンロードする.NETプログラムを作成しています - クローラのようなものです。私は各ページが非常に大きいので、各ページをダウンロードするためにストリームから複数回読む必要があることに気付きました。繰り返しGETリクエストを実行するときにパフォーマンスを向上させるためにバッファサイズを増やしてください。

現在、ストリームバッファサイズを5024バイトに設定しました。私の質問は、このサイズを増やすことによってストリームの読み込みを少なくする方が効率的でしょうか?それとも、解析する時間の少ないデータを処理するほうがよいでしょうか?

基本的に言い方が異なります - 一度に多くのデータを解析するのが速く、stream.readをあまり頻繁に呼び出さないでください。

ありがとうございます!

+0

最初は1024であれば、それを2048,8192または他の素敵なラウンドナンバーに変更するほうが意味がありました。しかし、なぜあなたはそれを単にプロファイルしないのですか?それを64kに変更して測定します。 – Groo

答えて

0

一般に、バッファのサイズを増やして一度に多くのデータをフィッティングすると、操作の速度が向上しますが、パフォーマンスの向上はせいぜい最低限に抑えられます。代わりに、あなたが試してみたいものは、非同期要求です。何かが thisのようなものです。これにより、アプリケーションはスレッドプールを使用してソケットまたはマルチプルから同時に読み取った後、処理対象がある場合にのみストリームで作業することができます。これにより、データがバッファにプルされているときにアプリケーションが他の処理を実行できるようになります。

+0

私は非同期操作で作業したことがありません。これはマルチスレッドアプリケーションでの最初の試行ですので、私が無知な音であれば私の言い訳をしてください...私が望んでいたのは、分割スレッドを使用することです - 解析する必要があるURLと、キュー内のURLをダウンロードして解析するためのプールの1つです。非同期呼び出しがなければ、これは可能ですか? – blizz

+0

@ user1115071これは絶対に可能です。しかし、効率的ではありません。 Webページをダウンロードしているスレッドは、ページが完全にダウンロードされるまでブロックし、解析に移ります。あなたの減速は、私の疑いのあることに、あなたのバッファにはありません。それは、ページを同期してダウンロードするとスレッドが完全に停止するという事実です。しかし、あなたが探しているものを達成するためには、2つの異なる作業を行い、それらの間にいくつかの共有オブジェクトを持つ2つの別々の関数を書くだけです。 "Thread t1 = new Thread(function1name); t1.start();"のようなスレッドを開始します。 – Dabloons

関連する問題