Question

Dans mon récent projet qui utilise Asp.net Mvc 2, nous avons constaté que le DisplayFor a des problèmes de performances. Je ne suis pas sûr que ce soit le réel question ou ai-je raté quelque chose?

J'espère que certains Asp.net Mvc Guru peut me l'expliquer. :)

Modèle.

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

Contrôleur

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

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

V1 (qui a des problèmes de performances)

<%@ 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>

modèle est

<%@ 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 (pas de problème de performance)

<%@ 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>

Je peux facilement voir la différence de performance entre V1 et V2.

EDIT : Quand je déploie mon IIS local 7 (avec la version de sortie) et (V1) devient très rapide. Le problème est résolu, mais je veux encore connaître la raison. :)

Merci,
Soe Moe

Était-ce utile?

La solution

est activée uniquement Caching en mode de libération. Si vous exécutez l'application en mode débogage, vous pouvez voir une baisse de performance en raison d'accès au disque.

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

Autres conseils

Le problème est que DisplayFor () utilise une expression lambda qui est compilé et exécuté lors de l'exécution.

Par conséquent, la différence de performance V1 peut être attribuée à cette étape de compilation "intermédiaire".

V2 est tout simplement un accès à la propriété qui n'a pas besoin de compilation.

Je prends une supposition, mais j'imagine que IIS7 est assez intelligent pour garder une copie en cache de la vue (et les expressions lambda compilées) autour pour une réutilisation future, ce qui signifie temps de rendu ultérieures sera comparable à V1 dans IIS 6.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top