2009-11-10 18 views
5

En mi proyecto reciente que está utilizando Asp.net Mvc 2, encontramos que el DisplayFor tiene un problema de rendimiento. No estoy tan seguro de si es el problema real o me perdí algo?Asp.net Mvc 2 DisplayFor Performance Issue?

Espero que algún Asp.net Mvc Guru pueda explicármelo. :)

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

controlador

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.

EDIT: Cuando despliegue en mi IIS local 7 (con la versión de lanzamiento) y (V1) se vuelve muy rápido. El problema está resuelto, pero aún quiero saber el motivo. :)

Gracias,
Soe Moe

Respuesta

0

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.

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.

+0

La suposición de que IIS7 es el factor clave en este caso, no es correcto. Vea la respuesta de Levi para obtener la información correcta. – thomasjo

+0

IIS7 se mencionó después de que se aceptara la respuesta, por lo que no puedo eliminarla :( – Codebrain