2009-11-10 12 views
5

Asp.net Mvc 2'yi kullanan son projemde, DisplayFor'un performans sorunu olduğunu gördük. gerçek sorunu olup olmadığından emin değilim veya bir şey mi özledim?Asp.net Mvc 2 DisplayFor Performans Sorunu?

Bazı Asp.net Mvc Guru'ların bana açıklamasını umuyorum.

Model.

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

Kontrolör

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

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

V1

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

Ve Şablon

<%@ 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 (herhangi bir performans sorunu)

olduğu (performans sorunu var olan)
<%@ 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> 

V1 ile V2 arasındaki performans farkını kolayca görebilirim.

EDIT: Yerel IIS 7'ye (Yayın sürümü ile) dağıtdığımda ve (V1) çok hızlı olur. Sorun çözüldü, ancak hala sebebini bilmek istiyorum. :)

sayesinde
Soe Moe

cevap

12

Önbelleğe alma yalnızca serbest bırakma modunda etkinleştirilmiştir. Uygulamayı hata ayıklama modunda çalıştırırsanız, disk erişimleri nedeniyle bir performans isabet görebilirsiniz.

Ayrıca bakınız: http://codeclimber.net.nz/archive/2009/04/22/how-to-improve-htmlhelper.renderpartial-performances-donrsquot-run-in-debug-mode.aspx

+0

Hata! Hata ayıklamayı yanlış olarak değiştirdim ve performans beklediğim şeye geri döndü ... – bytebender

0

sorun DisplayFor() derlenir ve çalışma yürütülür lambda ifade kullanmasıdır. Bu nedenle, V1'deki performans farkı, bu "ara" derleme adımına atfedilebilir.

V2, herhangi bir derleme gerektirmeyen bir özellik erişimdir.

Burada bir tahminde bulunuyorum, ancak IIS7'nin gelecekteki yeniden kullanım için görünümün (ve derlenmiş lambda ifadelerinin) önbelleğe alınmış bir kopyasını saklayacak kadar akıllı olduğunu ve sonraki oluşturma sürelerinin karşılaştırılabilir olduğunu düşünün. IIS 6'daki V1.

+0

IIS7 Buradaki anahtar faktör olduğu varsayımı doğru değildir. Doğru bilgi için Levi'nin cevabına bakınız. Yanıt kabul edildikten sonra – thomasjo

+0

IIS7'den bahsetmiştim, bu yüzden onu silemiyorum :( – Codebrain