2009-11-10 4 views
5

Asp.net MVC 2를 사용중인 최근 프로젝트에서 DisplayFor에 성능 문제가 있음을 발견했습니다. 나는 그것이 진짜 문제인지 또는 무엇인가 놓친 것이 확실하지 않은가?Asp.net MVC 2 DisplayFor 성능 문제?

나는 Asp.net MVC 전문가가 나에게 설명해주기를 바란다. :)

모델.

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

컨트롤러

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> 

그리고 템플릿

<%@ 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 (NO 성능 문제)

입니다 (성능 문제를 갖고있는)3210
<%@ 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과 V2의 성능 차이를 쉽게 볼 수 있습니다.

EDIT : 내 로컬 IIS 7 (릴리스 버전 포함)에 배포하면 (V1) 매우 빠르게됩니다. 문제는 해결되었지만 여전히 그 이유를 알고 싶습니다. :)

감사
SOE 모에

답변

0

문제는 DisplayFor()가 컴파일되고 런타임시 실행되는 람다 식을 사용한다는 것이다.

따라서 V1의 성능 차이는이 "중간"컴파일 단계에 기인 할 수 있습니다.

V2는 단순히 컴파일이 필요없는 속성 액세스 일뿐입니다.

여기서 추측하고 있지만, IIS7은 캐시 된 복사본 (및 컴파일 된 람다 식)을 나중에 재사용 할 수있을 정도로 똑똑하다고 생각합니다. 즉, 후속 렌더링 시간은 다음과 같습니다. IIS의 V1.

+0

IIS7 여기에 핵심 요소임을 가정, 올바르지 않습니다. 정확한 정보는 Levi의 대답을 참조하십시오. – thomasjo

+0

IIS7 답변을 수락 한 후에 언급 했으므로 삭제할 수 없습니다. ( – Codebrain