2012-07-20 14 views
6

खराब प्रदर्शन के बहुत उत्सुक मुद्दे में ठोकर खाई है जब एएसपीएनटी एमवीसी नियंत्रण jquery $ .ajax फ़ंक्शन द्वारा बुलाया जाता है। नियंत्रण एक डेटाबेस क्रिया करता है जो 403ms लेता है, लेकिन फायरबग के अनुसार कुल $ .ajax कॉल 3400ms है, जो कि अतिरिक्त ओवरहेड है। मुझे प्रदर्शन को अनुकूलित करने की ज़रूरत है, लेकिन मुझे स्पष्ट नहीं है कि यह ओवरहेड कहां से आता है।

यहां कोड है। मेरी नियंत्रक में, मैं अपने जे एस

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

एक और ध्यान दें, में

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; 

} 

है जब डेटाबेस कॉल निकाल दिया जाता है और मैं वस्तु मैन्युअल रूप से पॉप्युलेट, प्रदर्शन सुपर तेज है।

ऐसा लगता है कि 403ms से 3400ms तक जाकर सादा गलत है और स्पष्ट रूप से अन्यायपूर्ण ओवरहेड है। क्या आप कृपया बता सकते हैं कि यहां क्या गलत किया जा रहा है? यह बहुत नंगे हड्डियों है और मैं वास्तव में डेटाबेस पर जाने से नहीं बच सकता।

मैंने नियंत्रण को JsonResult के बजाय खाली सेट (ActionResult) वापस करने का प्रयास किया लेकिन यह एक ही मुद्दा था।

क्या यह एएसपीनेट एमवीसी मुद्दा है? अग्रिम

में धन्यवाद जोड़ने के लिए

मैं भी एक क्रिया है कि excel फ़ाइल और इसके अंदर ठीक उसी डेटाबेस कार्रवाई देता है संपादित। फ़ाइल 410ms में वापस आती है और $ .ajax फ़ंक्शन का उपयोग नहीं करती है। ऐसा लगता है कि $ .ajax किसी भी तरह देरी का कारण बन रहा है। मुझे बस डेटाबेस से डेटा प्राप्त करना है, और आमतौर पर यह बहुत तेज़ है।

मैंने नियंत्रक कोड के अंदर जोड़ा क्योंकि किसी ने इसके लिए पूछा था, लेकिन मैं दोहरा दूंगा कि अंदर (हाँ नियंत्रक कॉल के अंदर) 403 एमएस लेता है। जाहिर है, समस्या सर्वर या डेटाबेस कॉल पर नहीं है। ऐसा लगता है कि यह ग्राहक और सर्वर के बीच है। कोई मदद?

बस अगर कोई मेरी मदद करने का निर्णय लेता है 1) फायरबग में एक्शन गेट्रेट्स का उपयोग करके POST में कुल समय 3.54 है। 2) जब मैं नेट-> फ़ायरबग में सभी को नेविगेट करता हूं, जहां अनुरोध का टूटना सूचीबद्ध होता है, तो मुझे लगता है कि सबसे बड़ा समय प्रतीक्षा (3.5) है।

ऐसा प्रतीत होता है कि सर्वर और क्लाइंट के बीच संचार करते समय 3.5s - 403ms समय बिताया जाता है, लेकिन कहां और क्यों?

+0

SetSearchResults वापस लौटने वाला डेटा कितना मात्रा है? क्या यह बैंडविड्थ मुद्दा हो सकता है? –

+0

मुझे लगता है कि मैं खाली सेट (ActionResult) लौटकर आपका क्या मतलब है इसके बारे में स्पष्ट नहीं हूं। क्या आपका मतलब है कि आप वापस लौटे {} और यह अभी भी 4300ms लिया? मैं फायरबग व्यक्ति नहीं हूं और एमएस अनुप्रयोगों के साथ एमएस डीबगर का उपयोग करना पसंद करता हूं, लेकिन आपको लौटाई गई "प्रतिक्रिया" का निरीक्षण करने में सक्षम होना चाहिए। –

+0

क्या आपने डेटाबेस पर एक प्रोफाइलर डाला है यह देखने के लिए कि कौन से कॉल किए जा रहे हैं और वे कितने समय तक ले रहे हैं? उन कई मानकों के साथ, यह संभव है कि खोज sproc एक जानवर है। –

उत्तर

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

+0

और आपका समाधान वास्तव में क्या था? मुझे अपने पृष्ठों में से एक पर एक ही समस्या का सामना करना पड़ रहा है। अन्य सभी अजाक्स के माध्यम से तेजी से लोड हो जाते हैं, केवल 'प्रतीक्षा' क्षेत्र में अधिक समय व्यतीत कर रहा है .. डाटाबेस कॉल और डेटा की मात्रा अन्य पृष्ठों पर समान है ... – Brainfeeder

संबंधित मुद्दे