Frage

In meinem letzten Projekt, das Asp.net Mvc 2 verwendet, fanden wir, dass die DisplayFor Performance-Problem hat. Ich bin mir nicht so sicher, ob es die real Problem oder habe ich etwas verpasst?

Ich hoffe, einige Asp.net Mvc Guru es mir erklären kann. :)

Modell.

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 (das Performance-Problem hat)

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

Und Vorlage ist

<%@ 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 (kein Leistungsproblem)

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

Ich kann einfach, den Performance-Unterschied zwischen V1 und V2 sehen.

Bearbeiten : Wenn ich auf meinen lokalen IIS 7 (mit Release-Version) einsetzen und es (V1) wird sehr schnell. Das Problem wird gelöst, aber ich will noch den Grund wissen. :)

Danke,
Soe Moe

War es hilfreich?

Lösung

Caching ist nur im Release-Modus aktiviert. Wenn Sie die Anwendung im Debug-Modus ausführen, können Sie eine Performance-Einbußen auf Grund sehen auf die Festplatte zugreift.

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

Andere Tipps

Das Problem ist, dass DisplayFor () einen Lambda-Ausdruck verwendet, die zur Laufzeit kompiliert und ausgeführt wird.

Daher kann der Unterschied in der Leistung in V1 zu diesem „Zwischen“ Compilation Schritt zurückgeführt werden.

V2 ist einfach eine Eigenschaft Zugang, die keine Zusammenstellung benötigt.

Ich nehme eine Vermutung hier, aber ich glaube, dass IIS7 klug genug ist, eine Cache-Kopie der Ansicht zu halten (und die Lambda-Ausdrücke zusammengestellt) um für zukünftige Wiederverwendung, was bedeutet, nachfolgende Renderzeiten wird auf V1 vergleichbar sein in IIS 6.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top