2012-06-27 20 views
5

De acuerdo con Brad Wilson, RenderAction es más lento que RenderPartial.RenderAction vs RenderPartial rendimiento

Sin embargo, ¿alguien ha obtenido alguna estadística que demuestre la diferencia en el rendimiento?

Estoy en el proceso de desarrollar una aplicación donde las páginas se componen de "Widgets".

que tienen dos opciones:

Composición en la vista al nivel

RenderAction de llamadas para cada widget. Este es de lejos el enfoque más fácil, pero significa que estamos realizando un ciclo de MVC completo para cada widget.

Composición a nivel del controlador

Componer un modelo de vista de la página que contiene los datos que necesitamos para cada widget. Llame a RenderPartial para cada widget. Esto es mucho más complicado de implementar, pero significa que haremos solo un ciclo de MVC.

Probé los enfoques anteriores con 3 widgets diferentes en una página y la diferencia en el tiempo de renderizado fue de décimas de segundo (apenas vale la pena preocuparse).

Sin embargo, ¿alguien ha obtenido resultados de pruebas más concretos que este, o tal vez experimenta con ambos enfoques?

Respuesta

3

yo sugeriría 2 opciones más, ambos requieren para componer el modelo de vista a nivel de controlador y ambos pueden trabajar juntos (en función de los datos)

  1. Html.DisplayFor) (- plantillas de pantalla
  2. Ayudantes a través de los métodos de extensión

La opción 2 funciona muy bien si desea mantener esos widgets en diferentes conjuntos, después de todo, son solo funciones que devuelven una cadena. Creo que también tiene el mejor rendimiento, pero, por supuesto, pierdes las plantillas de "diseñador amigable". Creo que es importante considerar el aspecto de mantenimiento, no solo el rendimiento en bruto (hasta que realmente lo necesite, e incluso entonces, el almacenamiento en caché es más útil).

Para cosas pequeñas (formato de fecha o nombre, etc.) usaría ayudantes, ya que el html suele ser un lapso con una clase, para cosas más complejas usaría las plantillas de visualización.

+0

+1 para la sugerencia DisplayFor(). Actualmente estoy delegando la responsabilidad de representación en el widget, así que simplemente llamo '@ widget.Render (Html)' y el widget puede usar 'HtmlHelper' para renderizarse. Dicho esto, puedo hacer que esta delegación sea opcional y simplemente llamar 'DisplayFor()' de forma predeterminada. –

3

Recientemente trabajé en una aplicación que estaba experimentando problemas de rendimiento, y encontré una vista que realizaba cuatro llamadas a RenderAction, más otra en el diseño. Descubrí que cada llamada a RenderAction, incluso cuando agregué una acción ficticia que devolvía una vista vacía, tomó alrededor de 200-300ms (en mi máquina local). Multiplique por el número de llamadas y obtendrá un gran rendimiento en la página. En mi caso, hubo cuatro llamadas que causaron aproximadamente un segundo de sobrecarga innecesaria del lado del servidor. En comparación, las llamadas a RenderPartial rondaron el área de 0-10 ms.

Evitaría usar RenderAction siempre que sea posible a favor de RenderPartial. El controlador debe ser responsable de devolver toda la información necesaria. En el caso de los widgets, si necesita varias acciones para varios widgets, trataría de componerlos en una acción para que la sobrecarga de RenderAction solo ocurra una vez, aunque si su sitio funciona adecuadamente los mantendría separados para un diseño más limpio.

Editar: Recopilé esta información usando MiniProfiler y accediendo al sitio. No es súper preciso pero muestra claramente las diferencias.

Editar: Como Oskar señaló a continuación, la aplicación en cuestión probablemente tenía un código intensivo que se ejecuta para cada solicitud en global.asax. La magnitud de este golpe dependerá del código de la aplicación, pero RenderPartial evitará ejecutar otro ciclo de MVC por completo.

+2

Dudo que RenderAction() sea siempre 200ms + - si RenderAction() es siempre 200ms, entonces una solicitud del navegador para la misma acción de "vista vacía" también debería ser de al menos 200ms. Pero dado que las solicitudes del navegador en general pueden ser de hasta 10-20 ms, parece probable que la aplicación en cuestión tenga algún código pesado (por ejemplo, en global.asax) que se ejecute para cada solicitud. –

+0

@Oskar esto es cierto. No he trabajado en eso desde entonces, pero sé que tuvo algunos problemas bastante serios. Esto es simplemente para ilustrar que el ciclo MVC implícito que se llama en 'RenderAction()' puede tener una gran diferencia de rendimiento a pesar de aparecer de forma similar a 'RenderPartial()'. – mao47