2013-04-05 89 views
2

Backgound:我必須調用Web服務調用1500次,這需要大約1.3秒的時間才能完成。 (無法控制此第三方API。)總計時間= 1500 * 1.3 = 1950秒/ 60秒=大致32分鐘。提高異步Web調用的性能

我想出了我雖然是一個很好的解決方案,但它沒有泛出那麼好。 因此,我改變了異步Web調用的電話,認爲這會顯着幫助我的結果它沒有。

示例代碼:

預優化:

foreach (var elmKeyDataElementNamed in findResponse.Keys) 
{ 

    var getRequest = new ElementMasterGetRequest 
    { 
     Key = new elmFullKey 
     { 
      CmpCode = CodaServiceSettings.CompanyCode, 
      Code = elmKeyDataElementNamed.Code, 
      Level = filterLevel 
     } 
    }; 

    ElementMasterGetResponse getResponse; 
    _elementMasterServiceClient.Get(new MasterOptions(), getRequest, out getResponse); 
    elementList.Add(new CodaElement { Element = getResponse.Element, SearchCode = filterCode }); 
} 

隨着優化:

var tasks = findResponse.Keys.Select(elmKeyDataElementNamed => new ElementMasterGetRequest 
    { 
     Key = new elmFullKey 
      { 
       CmpCode = CodaServiceSettings.CompanyCode, 
       Code = elmKeyDataElementNamed.Code, 
       Level = filterLevel 
      } 
    }).Select(getRequest => _elementMasterServiceClient.GetAsync(new MasterOptions(), getRequest)).ToList(); 

Task.WaitAll(tasks.ToArray()); 

elementList.AddRange(tasks.Select(p => new CodaElement 
    { 
     Element = p.Result.GetResponse.Element, 
     SearchCode = filterCode 
    })); 

較小的採樣實例: 所以能夠輕鬆測試我做了60筆較小的取樣本花了60秒沒有優化,優化只花了50秒。我想盡管它已經接近30或更好。

我用wireshark來觀察交易過程,並意識到異步方式沒有像我認爲的那樣快速發送。

異步請求捕獲 Async requests captured

普通無優化 Normal no optimization 你可以看到asnyc推幾個非常快,然後脫落...... 另外請注意,要求10和11之間花了將近3秒。

創建線程的開銷是否會減慢需要秒數的任務? 注:我所指的任務是4.5 TAP任務庫。

爲什麼請求會比這更快。 我被告知我打的Apache Web服務器可以容納200個最大線程,所以我沒有看到一個問題。

我是不是在想這個很清楚? 在調用Web服務時,異步請求有沒有什麼優勢? 我有代碼錯誤嗎? 任何想法都會很棒。

+0

出的1.3秒鐘,這兩點需要執行一個電話,其實是如何的那個時候花了多少錢在服務器上執行的工作?如果服務器需要1.2秒來執行工作並且存在資源限制,則異步可能沒有什麼區別。 – Pete 2013-04-05 18:42:33

+0

瞭解服務器可能總是需要1.3秒,但如果請求同時運行,那麼它應該消耗更多的時間正確嗎? – retslig 2013-04-05 18:52:37

+0

這取決於資源的限制。有些事情不會從併發中受益,有些事情甚至會受到它的傷害。這取決於什麼導致服務器花費1.3秒。它可能不會從併發中受益。 – Pete 2013-04-05 19:17:53

回答

2

經過搜索,我發現這個職位,解決了我的問題很多天: Trying to run multiple HTTP requests in parallel, but being limited by Windows (registry)

的原因,請求不打服務器更快是因爲太我的客戶端代碼,並沒有與服務器做。默認情況下,C#只允許2個併發請求。 請參閱:http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

我只是簡單地添加了這行代碼,然後所有請求都以毫秒爲單位。

System.Net.ServicePointManager.DefaultConnectionLimit = 50; 

enter image description here

+0

那麼你是否也在引用的帖子中對註冊表進行了更改,或者您只更改了System.Net.ServicePointManager.DefaultConnectionLimit? – 2013-10-25 01:51:47

+0

沒有需要註冊表更改,這是嚴格的IE瀏覽器(如果我沒記錯的話),這並沒有處理。 – retslig 2013-10-25 14:54:55