2012-07-20 32 views
6

當jQuery $ .ajax函數調用asp.net MVC控件時,我偶然發現了一個性能很差的問題。該控件執行一個需要403ms的數據庫操作,但根據Firebug的總數$ .ajax調用是3400ms,這相當於增加了額外開銷。我需要優化性能,但我不清楚這種開銷是從哪裏來的。

這是代碼。 在我的控制,我有

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; 
} 

另需注意,當數據庫調用被刪除,我手動填充物,表現是超級快。

看起來從403ms到3400ms是明顯錯誤的,顯然有不合理的開銷。你能指出在這裏做錯了什麼嗎?這是相當枯燥的骨頭,我無法避免去數據庫。

我試着讓Control返回空集(ActionResult)而不是JsonResult,但它有同樣的問題。

這是asp.net MVC的問題? 由於事先

編輯補充

我也有一個返回裏面的Excel文件並具有完全相同的數據庫操作的動作。該文件返回410毫秒,而不是使用$ .ajax函數。看起來$ .ajax以某種方式造成了延遲。我需要的只是從數據庫中獲取數據,而且通常速度非常快。

我添加了控制器代碼的內部,因爲有人問它,但我會重複,內部(是控制器調用內部的總數)需要403毫秒。顯然,這個問題不在服務器或數據庫調用上。在我看來,它在客戶端和服務器之間。任何幫助?

只是爲了防止任何人決定幫助我 1)在Firebug中,使用Action GetResults進行POST的總時間爲3.54秒。 2)當我導航到Firebug中的Net-> All,列出了請求的細目時,我看到等待的最大時間(3.5s)。

看來,服務器和客戶端之間的通信需要3.5s - 403ms的時間,但是在哪裏以及爲什麼?

+0

SetSearchResults返回的數據量是多少?這可能是帶寬問題嗎? – 2012-07-20 17:01:20

+0

我想我不清楚你的意思是通過返回空集(ActionResult)。你的意思是你返回{},它仍然需要4300ms?我不是一個Firebug的人,更喜歡使用MS調試器和MS應用程序,但是你應該能夠檢查返回的「響應」。 – 2012-07-20 17:24:55

+0

您是否在數據庫中放置了一個探查器來查看正在進行的呼叫以及他們正在接聽多長時間?有了這麼多參數,搜索sproc可能就是一個野獸。 – 2012-07-20 22:20:22

回答

1

我發現問題和數據庫調用的問題。然而,我最初誤導的原因是計算時差的代碼片段。

DateTime start = DateTime.Now; 

SearchResult myReportsResult = _repository.GetResults(searchCriteria); 


DateTime got_it = DateTime.Now; 
TimeSpan diff = (got_it - start); 
int diff_ms = diff.Milliseconds; 

此代碼沒有給我正確的毫秒值。

+2

使用System.Diagnostics會更容易。秒錶「來計算時間使用。 – Amry 2012-07-28 05:05:36

+0

你的解決方案到底是什麼?我在我的一個頁面上遇到了同樣的問題。所有其他人都通過ajax快速加載,只有一個花費更多時間在'等待'區域。數據庫調用和數據量在其他頁面是相似的... – Brainfeeder 2015-09-11 07:13:39