[英]Stopwatch against C# Async: Am I fooled by the stopwatch or there's something there I don't know?
基本上,我想秒表針對對Google BigQuery的異步API調用。 我打算以兩種模式設計測試運行:(1)單線程模式-調用API,等待其完成任務,然后觸發下一個調用。 (2)多線程模式-通過Task.Run啟動多個調用,然后等待所有調用。 根據秒表,測試結果非常混亂。 在第一種模式下,每個API調用均在300毫秒內完成其任務,但是在第二種模式下,除了前幾個調用之外,每個API調用都需要10秒鍾以上。 那是巨大的差異! (Windows 8.1 Pro,8GB RAM,2核CPU)
可能是Google BigQuery方面的問題,但除了這種可能性之外,我還想確保自己正確使用了秒表,或者我正在衡量自己要衡量的內容。 是嗎
這是代碼:
static void Main(string[] args)
{
// SingleThreadMode();
MultiThreadMode();
}
private static void SingleThreadMode()
{
var batch = ReadOneBatchInArrays();
for (int i = 0; i < 100; i++)
{
try
{
Task.Run(async () => { await InsertAsync("T20150624", batch, InsertId); }).Wait(-1);
}
catch (AggregateException e)
{
foreach (var exception in e.InnerExceptions)
{
Console.WriteLine(exception);
}
}
}
Console.WriteLine("End");
Console.ReadLine();
}
private static void MultiThreadMode()
{
var batch = ReadOneBatchInArrays();
IList<Task> tasks = new List<Task>();
for (int i = 0; i < 100; i++)
{
try
{
tasks.Add(Task.Run(async () => { await InsertAsync("T20150624", batch, InsertId); }));
}
catch (AggregateException e)
{
foreach (var exception in e.InnerExceptions)
{
Console.WriteLine(exception);
}
}
}
Task.WaitAll(tasks.ToArray(),-1);
Console.WriteLine("End");
Console.ReadLine();
}
InsertAsync中的秒表:
Stopwatch stopwatch = Stopwatch.StartNew();
TableDataInsertAllResponse response = await BqService.Tabledata.InsertAll(request, ProjectId, DatasetId, tableId).ExecuteAsync();
stopwatch.Stop();
Logger.Trace("BigQuery.InsertAll#Back|row count|milliseconds~{0}~{1}", rowList.Count, stopwatch.ElapsedMilliseconds);
解決非常感謝以下回答。 我最終在我的app.config中添加了幾行,它解決了這個問題。
<system.net>
<connectionManagement>
<add address="*" maxconnection="2000" />
</connectionManagement>
</system.net>
如以下問題所示,您最有可能遇到.Net中的並發連接限制: 並發HttpWebRequests的最大數量 。
限制到單個主機的最大並發請求數。 因此,發生的事情是前幾個請求立即通過,但是一旦達到限制,后一個請求將開始阻塞並等待第一個請求完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.