2015-11-02 25 views
1

我有一個WebAPI函數執行循環計算來查找單個數值。優化長時間運行的WebAPI方法

從我的客戶端JavaScript,我做了大約20個併發請求到這個函數爲單頁面加載。我已經通過Chrome的網絡性能工具確認所有請求都是在同一時間完成的,但請求會按順序接收響應(最初的請求需要2秒鐘,後面的需要8秒鐘),因此服務器似乎是瓶頸。

我已經嘗試優化我的代碼,通過使其異步,雖然我不知道我做的是否正確或它提高了性能。

[HttpGet] 
public async Task<double> CalcResult(double First, double Second) 
{ 
    var result = await Task.Run(()=>LoopCalculationFunction(First,Second)); 
    return result * 100; 
} 

這樣做是否正確,有什麼辦法可以進一步優化這個功能嗎?

+0

因此,在'async-await'實現之後,您是否看到客戶端性能提升?進一步優化,如果需要的話,我想應該是修復'LoopCalculationFunction'中的複雜性? –

+0

您可能會遇到Chrome的連接限制:http://superuser.com/questions/499114/how-to-increase-chromes-connections-per-server –

+1

此外,這是「Task.Run」的不當使用。它什麼都不做,實際上是有害的。請參閱http://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-dont-use.html –

回答

4

您應該將您的客戶端JavaScript更改爲批量調用,理想情況下將其轉換爲單個請求。傳遞數組firstsecond值並返回數組。

1)每次往返速度都很慢,您可以通過一次往返使速度更快。

2)您將達到同時連接的瀏覽器每服務器(或每個配置文件)限制。

3)這是不恰當的使用Task.Run,見http://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-dont-use.html

4)如果您的總連接時間過大,你應該移到輪詢API:發佈計算請求,然後輪詢進步和最終的結果。

+1

這些建議很棒。我想重構我的客戶端代碼捆綁請求是可行的。一旦我這樣做,我可以使用linq parallels來運行該功能,消除所有不必要的http請求。我沒有想到的東西。 – phosplait