Pregunta

En mi reciente proyecto que está utilizando Asp.net MVC 2, hemos encontrado que el DisplayFor tiene problema de rendimiento. No estoy tan seguro de si se trata de la real tema o me he perdido algo?

Espero que algunos Asp.net MVC Guru puede explicar a mí. :)

Modelo.

public class Customer
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string EmailAddress { get; set; }

    public static IEnumerable<Customer> GetCustomers()
    {            
        for (int i = 0; i < 1000; i++)
        {
            var cust = new Customer()
            {
                CustomerId = i + 1,
                Name = "Name - " + (i + 1),
                Address = "Somewhere in the Earth...",
                EmailAddress = "customerABC"
            };

            yield return cust;
        }
    }
}

Controller

public ActionResult V1()
    {            
        return View(Customer.GetCustomers());
    }

    public ActionResult V2()
    {
        return View(Customer.GetCustomers());
    }

V1 (que tiene problema de rendimiento)

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Customer>>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    V1
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>V1</h2>
    <table>
    <%foreach (var cust in this.Model)
      {%>
        <%= Html.DisplayFor(m => cust) %>  
      <%} %>
    </table>
</asp:Content>

Y la plantilla es

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Customer>" %>
<tr>
    <td><%= this.Model.CustomerId %></td>
    <td><%= this.Model.Name %></td>
    <td><%= this.Model.Address %></td>
    <td><%= this.Model.EmailAddress %></td>    
</tr>

V2 (sin problema de rendimiento)

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Customer>>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    V2
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>V2</h2>
    <table>
    <%foreach (var cust in this.Model)
      {%>
        <tr>
            <td><%= cust.CustomerId%></td>
            <td><%= cust.Name%></td>
            <td><%= cust.Address%></td>
            <td><%= cust.EmailAddress%></td>    
        </tr>
      <%} %>
      </table>
</asp:Content>

Puedo ver fácilmente la diferencia de rendimiento entre V1 y V2.

Editar : Cuando despliego a mi local de IIS 7 (con la versión de lanzamiento) y (V1) se hace muy rápido. El problema está resuelto, pero todavía quiero saber la razón. :)

Gracias,
Soe Moe

¿Fue útil?

Solución

El almacenamiento en caché está habilitado sólo en modo de lanzamiento. Si ejecuta la aplicación en modo de depuración, es posible que vea un impacto en el rendimiento debido a los accesos al disco.

Vea también: http://codeclimber.net.nz/archive/2009/04/22/how-to-improve-htmlhelper.renderpartial-performances-donrsquot-run-in-debug-mode.aspx

Otros consejos

La cuestión es que DisplayFor () utiliza una expresión lambda que se compila y se ejecuta en tiempo de ejecución.

Por lo tanto, la diferencia de rendimiento en V1 se puede atribuir a este paso de compilación "intermedio".

V2 es simplemente un acceso a la propiedad que no necesita ninguna compilación.

Me estoy tomando una conjetura aquí, pero me imagino que IIS7 es lo suficientemente inteligente como para mantener una copia en caché de la vista (y las expresiones lambda compilados) alrededor de reutilización en el futuro, es decir, posteriores tiempos de entrega será comparable a V1 en IIS 6.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top