2017-09-12 16 views
0

マルチスレッドのWeb要求を使用したいと思いますが、期待したパフォーマンスが得られません。マルチスレッドのWeb要求パフォーマンスの問題

私は、1Gbpsのアップロードと1Gbpsのダウンロードで、4つのコアを搭載したコンピュータで動作しています。

テスト用に私はGoogleのメインページをダウンロードしています。

Googleのページからのデータのサイズは〜50 KBです。

私は同時に1000年のリクエストを送信していると私は〜2秒以内にすべての要求を完了する場合を除き、それが完了するまでに20秒以上かかります

私のコードは次のようになります。

 bool success = ThreadPool.SetMinThreads(workerThreads: 2000, completionPortThreads: 1000); 
     success = ThreadPool.SetMaxThreads(2000, 2000); 
     DateTime dt = DateTime.UtcNow; 
     Parallel.For(0, 1000, (num) => 
     { 
      string url = "https://www.google.co.il/?gfe_rd=cr&dcr=0&ei=OZy3WcmoMY7b8Affj4F4&gws_rd=ssl"; 
      using (WebClient web = new WebClient()) 
      { 
       byte[] bytes = web.DownloadData(url); 
      } 
     } 
     ); 
     double sec = (DateTime.UtcNow - dt).TotalSeconds; 
     Console.WriteLine(sec); 
+2

https://stackoverflow.com/questions/1361771/max-number-of-concurrent-httpwebrequests –

+0

、 'Parallel.For'は一つだけを使用することに注意してくださいコアごとのスレッド(あなたの場合は4つのスレッド)。これはI/Oバウンド操作に使用する適切なツールではありません –

+0

また、ServicePiontManagerは、デフォルトでは、任意のホストに対する2つの同時リクエストに制限します。デフォルトの接続制限を変更するか、app.configファイルにconnectionManagementセクションを追加する必要があります。 –

答えて

0

私は思いますあなたの場合のより良い選択は、明示的な非同期操作でHttpClientを使用し、ウィンドウがスレッドプール自体を管理できるようにすることです。

Stopwatch sw = new Stopwatch(); 
sw.Start(); 

for (int i = 0; i < 1000; i++) 
{ 
    var httpClient = new HttpClient(); 
    results[i] = httpClient.GetByteArrayAsync(@"https://www.google.co.il/?gfe_rd=cr&dcr=0&ei=OZy3WcmoMY7b8Affj4F4&gws_rd=ssl"); 
} 

var status = Task.WhenAll(results); //WhenAny if you can process results independently 
var pages = status.Result; 
sw.Stop(); 
double sec = sw.Elapsed.TotalSeconds; 
Console.WriteLine(sec); 

サイドノート:time measurementためStopwatchを使用することを検討してください。

-1

ソリューションは、その次のとおりです。また

 System.Net.ServicePointManager.DefaultConnectionLimit = int.MaxValue; 
+4

この回答は混乱しており、文脈に欠けています。いくつかの説明を追加する必要があります –

関連する問題