簡體   English   中英

針對C#異步的秒表:我被秒表所迷惑了,還是有我不知道的東西?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM