Оптимизация долгосрочного метода WebAPI
У меня есть функция WebAPI, которая выполняет вычисление цикла, чтобы найти одно числовое значение.
Из моего клиентского JavaScript я делаю около 20 одновременных запросов к этой функции для загрузки одной страницы. С помощью инструмента Chrome для повышения производительности сети я подтвердил, что все запросы выполняются одновременно, но запросы получают ответы последовательно (первоначальные занимают 0,2 секунды, а последующие - до 8), поэтому сервер является узким местом.,
Я попытался оптимизировать свой код, сделав его асинхронным, хотя я не уверен, что сделал это правильно или что он вообще улучшил производительность.
[HttpGet]
public async Task<double> CalcResult(double First, double Second)
{
var result = await Task.Run(()=>LoopCalculationFunction(First,Second));
return result * 100;
}
Правильно ли это сделано и можно ли как-нибудь оптимизировать эту функцию?
1 ответ
Вы должны изменить свой javascript на стороне клиента для пакетных вызовов, в идеале в один запрос. Передать массив first
а также second
значения и получить массив обратно.
1) Каждый круговой обход медленный, вы можете сделать это быстрее за один раз.
2) Вы достигнете лимитов для каждого сервера (или для профиля) браузера для одновременных подключений.
3) Это неуместное использование Task.Run
см. http://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-dont-use.html
4) Если ваше общее время соединения слишком велико, вы должны перейти к API-интерфейсу опроса: опубликуйте запрос на вычисление, а затем запросите прогресс и возможный результат.