2012-07-20 9 views
6

He tropezado con un problema muy curioso de bajo rendimiento cuando el control asp.net MVC se llama mediante la función jquery $ .ajax. El control realiza una acción de base de datos que tarda 403 ms, pero la llamada total de $ .ajax es de 3400 ms de acuerdo con Firebug, que es una gran parte de la carga adicional. Necesito optimizar el rendimiento, pero no tengo claro de dónde viene esta sobrecarga.

Aquí está el código. En mi controlador, que tienen

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; 

} 

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

Otra nota, cuando se quita la llamada base de datos y que pueblan el objeto de forma manual, el rendimiento es muy rápida.

Parece que pasar de 403ms a 3400ms es completamente erróneo y claramente tiene una sobrecarga injustificada. ¿Puedes señalar qué se está haciendo mal aquí? Es bastante básico y realmente no puedo evitar ir a la base de datos.

Intenté que el Control devolviera el conjunto vacío (ActionResult) en lugar de JsonResult pero tenía el mismo problema.

¿Este es el problema de asp.net MVC? gracias de antemano

editar para agregar

También tengo una acción que devuelve un archivo de Excel y exactamente la misma operación de base de datos en su interior. El archivo vuelve a 410ms y no usa la función $ .ajax. Parece que $ .ajax está causando la demora de alguna manera. Todo lo que necesito es obtener los datos de la base de datos, y normalmente es muy rápido.

Agregué el interior del código del controlador porque alguien lo solicitó, pero repetiré que el interior (sí el total dentro de la llamada del Controlador) lleva 403 ms. Claramente, el problema no está en el servidor o la llamada a la base de datos. Me parece que es entre cliente y servidor. ¿Alguna ayuda?

En caso de que alguien decida ayudarme 1) En Firebug, el tiempo total que le tomó a POST usar Action GetResults es 3.54s. 2) Cuando navego a Net-> All en Firebug, donde aparece el desglose de la solicitud, veo que el tiempo más grande se gasta en esperar (3.5s).

Parece que el tiempo de 3.5s - 403ms se usa al comunicarse entre el servidor y el cliente, pero ¿dónde y por qué?

+0

¿Qué volumen de datos devuelve SetSearchResults? ¿Podría ser esto un problema de ancho de banda? –

+0

Supongo que no tengo claro qué quiere decir al devolver el conjunto vacío (ActionResult). ¿Quiere decir que regresó {} y aún tardó 4300ms? No soy una persona Firebug y prefiero usar un depurador MS con aplicaciones MS, pero debería poder inspeccionar la "respuesta" devuelta. –

+0

¿Ha puesto un generador de perfiles en la base de datos para ver qué llamadas se están realizando y cuánto tiempo están tomando? Con tantos parámetros, es posible que sproc de búsqueda sea una bestia. –

Respuesta

1

Encontré el problema y el problema ES con la llamada a la base de datos. Sin embargo, la razón por la que me equivocaron al principio es la pieza de código que calcula la diferencia de tiempo.

DateTime start = DateTime.Now; 

SearchResult myReportsResult = _repository.GetResults(searchCriteria); 


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

Este código no me dio el valor correcto de milisegundos.

+2

Será más fácil usar 'System.Diagnostics.Cronómetro' en su lugar para calcular el uso del tiempo. – Amry

+0

¿Y cuál fue exactamente su solución? Estoy enfrentando el mismo problema en una de mis páginas. Todos los demás se cargan rápidamente a través de ajax, solo uno pasa más tiempo en la zona de espera. La llamada a la base de datos y la cantidad de datos son simulares en las otras páginas ... – Brainfeeder