当 jquery $.ajax 函数调用 asp.net MVC 控件时,我偶然发现了一个非常奇怪的性能不佳问题。该控件执行一个需要 403 毫秒的数据库操作,但根据 Firebug,总的 $.ajax 调用是 3400 毫秒,这是相当多的额外开销。我需要优化性能,但我不清楚这些开销来自哪里。
这是代码。在我的控制器中,我有
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 毫秒是完全错误的,并且显然有不合理的开销。你能指出这里做错了什么吗?这是非常简单的骨头,我真的无法避免去数据库。
我尝试让控件返回空集(ActionResult)而不是 JsonResult,但它有同样的问题。
这是 asp.net MVC 问题吗?
更新
我还有一个操作,它返回一个 Excel 文件和其中的完全相同的数据库操作。该文件在 410 毫秒内返回并且不使用$.ajax
函数。似乎$.ajax
以某种方式导致了延迟。我只需要从数据库中获取数据,而且通常速度非常快。
我添加了控制器代码的内部,因为有人要求它,但我会重复内部(是的,控制器调用的总内部)需要 403 毫秒。显然,问题不在于服务器或数据库调用。在我看来,它位于客户端和服务器之间。
笔记:
- 在 Firebug 中,使用 Action GetResults 进行 POST 的总时间为 3.54 秒。
- 当我导航到 Firebug 中的 Net->All 时,其中列出了请求的细分,我看到等待的时间最长(3.5 秒)。
在服务器和客户端之间进行通信时,似乎花费了 3.5s - 403ms 的时间,但是在哪里以及为什么?