Я наткнулся на очень любопытную проблему низкой производительности, когда управление asp.net MVC вызывается функцией jquery $.ajax. Элемент управления выполняет действие с базой данных, которое занимает 403 мс, но общий вызов $.ajax составляет 3400 мс, согласно Firebug, что довольно много дополнительных накладных расходов. Мне нужно оптимизировать производительность, но я не понимаю, откуда берутся эти накладные расходы.
Вот код. В моем контроллере у меня есть
public JsonResult SetSearchResults(Criteria searchCriteria)
{
SearchResult myReportsResult = _repository.GetResults(searchCriteria);
//the statement above takes 403 ms
return Json(myReportsResult);
}
public SearchResult GetResults(SearchCriteria searchCriteria)
{
SearchResult result = SearchResult();
DataTable dbResults = _da.GetDBResults(searchCriteria);
List<IncidentReportHeader> irs = new List<IncidentReportHeader>();
for (int i = 0; i < dbResults.Rows.Count; i++)
{
IncidentReportHeader ir = new IncidentReportHeader();
//populate all the properties of the ir object here,
irs.Add(ir);
}
result.Reports = irs;
return result;
}
//models
public class SearchResult
{
private List<IncidentReportHeader> _res;
private int _numOfPages=0;
private int _recordsPerPage=0;
public List<IncidentReportHeader> Reports {
get { return _res; }
set
{
_res = value;
}
}
public SearchResult()
{
_res = new List<IncidentReportHeader>();
}
}
}
//db call
public DataTable GetDBResults(SearchCriteria searchCriteria)
{
//add all params to the db object needed for the stored procedure here
DataTable dt = _db.ExecuteStoredProc("myDB.PACKAGE_NAME.stored_proc", 2000, ref _spParams, ref _spResultVariables);
return dt;
}
в моем JS
function SearchIncidentReports() {
//pack the searchCriteria object here
var searchCriteria =...
var start = new Date().getTime();
$.ajax({
contentType: 'application/json, charset=utf-8',
type: "POST",
url: myController/SetSearchResults,
data: JSON.stringify({ searchCriteria: searchCriteria }),
cache: false,
dataType: "json",
success: function (response) {
var got_data = new Date().getTime();
var diff1 = got_data - start;
alert("data loaded in: " + diff1 + " ms");
// do whatever you need with the data here.
// diff1 = 3400ms which is what Firebug shows too
},
error: function (xhr, ajaxOptions, thrownError) {
var result = $.parseJSON(xhr.responseText);
alert(result.ErrorMessage);
}
});
return false;
}
Еще одно замечание: когда вызов базы данных удаляется и я заполняю объект вручную, производительность становится очень высокой.
Кажется, что переход с 403 мс на 3400 мс совершенно неверен и явно имеет неоправданные накладные расходы. Не могли бы вы указать, что здесь делается неправильно? Это довольно голые кости, и я не могу избежать обращения к базе данных.
Я попытался заставить Control вернуть пустой набор (ActionResult ), а не JsonResult, но у него была та же проблема.
Это проблема asp.net MVC?
У меня также есть действие, которое возвращает файл Excel и точно такую же операцию с базой данных внутри него. Файл возвращается через 410 мс и не использует функцию $.ajax
. Похоже, $.ajax
каким-то образом вызывает задержку. Все, что мне нужно, это получить данные из базы данных, и обычно это очень быстро.
Я добавил внутреннюю часть кода контроллера, потому что кто-то просил об этом, но я повторю, что внутренняя часть (да, общая внутренняя часть вызова контроллера )занимает 403 мс. Ясно, что проблема не в вызове сервера или базы данных. Мне кажется, что между клиентом и сервером.
Примечания:
Получается, что при общении между сервером и клиентом тратится 3,5 с -403 мс, но где и почему?