2012-07-20 10 views
6

Sono incappato in un problema molto curioso di scarse prestazioni quando il controllo asp.net MVC viene chiamato dalla funzione jquery $ .ajax. Il controllo esegue un'azione di database che richiede 403 ms, ma la chiamata $ .ajax totale è 3400 ms secondo Firebug, che è un bel po 'di overhead aggiunto. Ho bisogno di ottimizzare le prestazioni, ma non sono chiaro da dove viene questo sovraccarico.

Ecco il codice. Nel mio controller, ho

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; 

} 

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

Un'altra nota, quando la chiamata del database viene rimosso e mi popolano l'oggetto manualmente, la prestazione è super veloce.

Sembra che passare da 403 ms a 3400 ms sia chiaramente sbagliato e chiaramente ha un sovraccarico ingiustificato. Puoi per favore indicare cosa viene fatto di sbagliato qui? È un bel pezzo di ossa e non posso davvero evitare di andare al database.

Ho provato a fare in modo che Control restituisca il set vuoto (ActionResult) piuttosto che JsonResult ma ha lo stesso problema.

È questo il problema MVC asp.net? grazie in anticipo

A cura di aggiungere

Ho anche un'azione che restituisce un file excel ed esattamente la stessa operazione del database interno. Il file torna a 410 ms e non utilizza la funzione $ .ajax. Sembra che $ .ajax stia causando il ritardo in qualche modo. Tutto ciò di cui ho bisogno è di ottenere i dati dal database, e normalmente è molto veloce.

Ho aggiunto l'interno del codice del controller perché qualcuno lo ha richiesto, ma ripeterò che l'interno (sì il totale all'interno della chiamata Controller) richiede 403 ms. Chiaramente, il problema non è sulla chiamata del server o del database. Mi sembra che sia tra client e server. Qualsiasi aiuto?

Nel caso in cui qualcuno decidesse di aiutarmi 1) In Firebug il tempo totale impiegato da POST per utilizzare GetResults è 3.54s. 2) Quando navigo su Net-> Tutti in Firebug, dove è elencata la scomposizione della richiesta, vedo che il tempo più grande è dedicato all'attesa (3,5 s).

Sembra che siano trascorsi 3,5 - 403 ms di tempo quando si comunica tra server e client, ma dove e perché?

+0

Quale volume di dati viene restituito da SetSearchResults? Questo potrebbe essere un problema di larghezza di banda? –

+0

Immagino di non essere chiaro su cosa intendi restituendo il set vuoto (ActionResult). Vuoi dire che hai restituito {} e ci sono voluti ancora 4300 ms? Non sono una persona Firebug e preferisco usare il debugger MS con le applicazioni MS, ma dovresti essere in grado di ispezionare la "risposta" restituita. –

+0

Hai messo un profiler sul database per vedere quali chiamate sono state fatte e quanto tempo stanno prendendo? Con quei molti parametri, è possibile che la ricerca sproc sia una bestia. –

risposta

1

Ho trovato il problema e il problema è con la chiamata al database. Tuttavia, la ragione per cui sono stato in un primo momento fuorviato è la parte di codice che calcola la differenza di orario.

DateTime start = DateTime.Now; 

SearchResult myReportsResult = _repository.GetResults(searchCriteria); 


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

Questo codice non mi ha dato il valore corretto in millisecondi.

+2

Sarà più facile usare 'System.Diagnostics.Cronometro invece di calcolare l'utilizzo del tempo. – Amry

+0

E qual è stata esattamente la tua soluzione? Sto affrontando lo stesso problema su una delle mie pagine. Tutti gli altri vengono caricati velocemente attraverso l'Ajax, solo uno sta trascorrendo più tempo nella zona "in attesa". La chiamata al database e la quantità di dati sono simulari nelle altre pagine ... – Brainfeeder

Problemi correlati