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來觀察交易過程,並意識到異步方式沒有像我認爲的那樣快速發送。
異步請求捕獲
普通無優化 你可以看到asnyc推幾個非常快,然後脫落...... 另外請注意,要求10和11之間花了將近3秒。
創建線程的開銷是否會減慢需要秒數的任務? 注:我所指的任務是4.5 TAP任務庫。
爲什麼請求會比這更快。 我被告知我打的Apache Web服務器可以容納200個最大線程,所以我沒有看到一個問題。
我是不是在想這個很清楚? 在調用Web服務時,異步請求有沒有什麼優勢? 我有代碼錯誤嗎? 任何想法都會很棒。
出的1.3秒鐘,這兩點需要執行一個電話,其實是如何的那個時候花了多少錢在服務器上執行的工作?如果服務器需要1.2秒來執行工作並且存在資源限制,則異步可能沒有什麼區別。 – Pete 2013-04-05 18:42:33
瞭解服務器可能總是需要1.3秒,但如果請求同時運行,那麼它應該消耗更多的時間正確嗎? – retslig 2013-04-05 18:52:37
這取決於資源的限制。有些事情不會從併發中受益,有些事情甚至會受到它的傷害。這取決於什麼導致服務器花費1.3秒。它可能不會從併發中受益。 – Pete 2013-04-05 19:17:53