2010-09-02 28 views
19

Ocasionalmente compruebo el rendimiento de una aplicación ASP.NET MVC que estamos construyendo. Iba a insertar una vista parcial en un bucle, y solo por curiosidad, verifiqué cuánto tiempo me llevó renderizar la página. El resultado no fue bueno.ASP.NET MVC vistas parciales lento?

Necesito hacer una investigación más concluyente, pero por si había alguien con problemas similares o más información, esto es lo que tengo hasta ahora. En primer lugar, debería decir que todos los resultados y mediciones se realizaron después de varias cargas de página y que configuré <compilation debug="false"> en mi web.config.

  • Parece que un solo render parcial tiene unos 5 ms de acierto (al menos en mi entorno). Cuando en línea el contenido real de la vista parcial, obtengo prácticamente 0ms.
  • Cuando incluyo una vista parcial vacía en un bucle de unos 70 elementos, el tiempo total de renderización aumenta en ~ 60ms. Entonces, hay algo de almacenamiento en caché, presumiblemente, pero no es ideal.
  • Depugé ASP.NET MVC, y descubrí que las vistas parciales se almacenan en caché, pero solo almacena en caché las rutas a las ascx. Las vistas reales se instancian cada vez usando el método BuildManager.CreateInstanceFromVirtualPath.
  • Y ahora el bit interesante: cuando se incluye la misma vista parcial usando la sintaxis de WebForms (<my:UserContol runat="server" />), los 60 ms adicionales desaparecen.

De acuerdo con las observaciones anteriores, parece que el culpable es el método BuildManager.CreateInstanceFromVirtualPath. Tal vez, no estaba destinado a ser llamado varias veces. Es probable que las formas web no lo usen; o usarlo de alguna manera solo una vez por cada ascx?

+0

Entonces, su pregunta es; son vistas parciales más lentas que el contenido inline, del que ya tiene la respuesta. :) – bzlm

+0

La pregunta era si es posible obtener el mismo rendimiento que en Webforms. –

+3

60ms no es lento para mí. – jfar

Respuesta

2

Supongo que la respuesta es ... ¿depende?

Las vistas parciales disminuyen el rendimiento (la sobrecarga de la llamada real, etc.).

Las vistas parciales no se almacenan en caché.

Incluir una vista parcial dentro de un bucle disminuirá el rendimiento y puede acelerarse nuevamente moviendo el bucle dentro de la vista parcial.

Algunos ejemplos de lectura (que hace referencia al almacenamiento en caché de la ruta de acceso) se pueden encontrar en here.

+2

El rendimiento real es * vistas recursivas parciales *. Si bien es cierto que en algunos casos es un concepto apropiado (me viene a la mente un menú de árbol), el rendimiento inesperadamente se deterioró peor que linealmente la última vez que lo probé. – bzlm

2

60ms es un intervalo tan pequeño que me suena como ruido estadístico, no una prueba concluyente de una diferencia de rendimiento.

+0

Estaba teniendo problemas de rendimiento con vistas parciales/DisplayTemplates organizadas de forma anidada. La página de inicio de mi aplicación tardaba entre 5 y 10 segundos en renderizarse (según los datos). Intenté debug = false y caminos completos para reducir los tiempos de búsqueda, ahora he eliminado los parciales y displaytemplates y puse toda la afeitadora en línea en vista única. Esto está en una página bastante pesada con muchos niveles de elementos anidados. El resto del tiempo me encantan los displaytemlates y las vistas parciales, pero en este caso necesitaba optimizarlos. – MemeDeveloper

8

He acaba de cambiar una vista MVC2 el uso de una vista parcial en un bucle a un solo punto de vista, es decir:

<table> 
foreach(var a in items) 
{ 
    <%: Html.Partial("SomePartialView",a) %> 
} 
</table> 

Dónde SomePartialView contiene el código para hacer que una única fila en una tabla, por ejemplo, :

<tr><td>Model.Name</td><td>Model.description</td></tr> 

a:

foreach(var a in items) 
{ 
    <tr><td>a.Name</td><td>a.description</td></tr> 
} 

para una vista de la representación 900 filas de la página tiempo de render descendieron de carga de la página 5+ minutos a menos de 30 segundos, la prueba bastante concluyente de que existe una sobrecarga significativa cuando llamas a vistas parciales Estoy seguro de que esto es insignificante cuando tienes una sola llamada, sin embargo, en un bucle, todo se resume, por lo que recomendaba evitar las vistas parciales en un bucle, si es posible.

Cuestiones relacionadas