asp.net-mvc - tag - view component asp.net core
ASP.NET MVC vistas parciales lentas? (3)
60ms es un intervalo tan pequeño que me parece un ruido estadístico, no una evidencia concluyente de una diferencia de rendimiento.
Simplemente verifico 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 comprobé el tiempo que tardaba en renderizar la página. El resultado no fue bueno.
Necesito hacer una investigación más concluyente, pero en caso de que haya alguien con problemas similares o más información, esto es lo que tengo hasta ahora. Primero, debo decir que todos los resultados y las mediciones se realizaron después de varias cargas de página y que he establecido <compilation debug="false">
en mi web.config.
- Parece que un solo renderizado parcial incurre en un hit de 5 ms (al menos en mi entorno). Cuando inserto el contenido real de la vista parcial, obtengo prácticamente 0 ms.
- Cuando incluyo una vista parcial vacía en un bucle de aproximadamente 70 elementos, el tiempo total de procesamiento aumenta en ~ 60 ms. Así que hay un cierto almacenamiento en caché, pero no es lo ideal.
- Depuré de ASP.NET MVC y descubrí que las vistas parciales se almacenan en caché, pero solo almacena en caché las rutas de acceso de los ascx. Las vistas reales se BuildManager.CreateInstanceFromVirtualPath instancias cada vez que utilizan el método BuildManager.CreateInstanceFromVirtualPath .
- Y ahora lo interesante: cuando se incluye la misma vista parcial con la sintaxis de WebForms (
<my:UserContol runat="server" />
), desaparecen los 60ms adicionales.
Entonces, según las observaciones anteriores, parece que el culpable es el método BuildManager.CreateInstanceFromVirtualPath. Tal vez, no estaba destinado a ser llamado varias veces. Los formularios web presumiblemente no lo usan; ¿O usarlo de alguna manera solo una vez para cada ascx?
Acabo de cambiar una vista MVC2 de usar una vista parcial en un bucle a una sola vista, es decir:
<table>
foreach(var a in items)
{
<%: Html.Partial("SomePartialView",a) %>
}
</table>
Donde SomePartialView contiene el código para representar una sola 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 que muestra 900 filas, el tiempo de procesamiento de la página se redujo de 5 minutos o más a menos de 30 segundos, lo que es una prueba concluyente de que hay una sobrecarga significativa al llamar vistas parciales. Estoy seguro de que esto es insignificante cuando tiene una sola llamada, sin embargo, en un bucle todo se suma, por lo que recomiendo evitar las vistas parciales en un bucle si es posible.
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 en su lugar.
Aquí se puede encontrar una muestra de lectura (que hace referencia al almacenamiento en caché de la ruta de acceso).