2009-11-10 4 views
5

В моем недавнем проекте, в котором используется Asp.net Mvc 2, мы обнаружили, что DisplayFor имеет проблемы с производительностью. Я не уверен, действительно ли это вопрос или я что-то пропустил?Asp.net Mvc 2 DisplayFor Performance Issue?

Надеюсь, какой-то Asp.net Mvc Guru может объяснить это мне. :)

Модель.

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 (нет проблем с производительностью)

<%@ 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 (с версией Release) и он (V1) становится очень быстрым. Проблема решена, но я все еще хочу знать причину. :)

Благодаря,
Сое Мо

ответ

12

Кэширование разрешено только в режиме деблокирования. Если вы запускаете приложение в режиме отладки, вы можете увидеть поражение производительности из-за доступа к диску.

Смотрите также: http://codeclimber.net.nz/archive/2009/04/22/how-to-improve-htmlhelper.renderpartial-performances-donrsquot-run-in-debug-mode.aspx

+0

Спасибо! Я переключил отладку на false, и производительность вернулась к тому, что я ожидал от нее ... – bytebender

0

Вопрос заключается в том, что Displayfor() использует лямбда-выражение, которое компилируется и выполняется во время выполнения.

Следовательно, разницу в производительности в V1 можно отнести к этому «промежуточному» этапу компиляции.

V2 - это просто доступ к собственности, который не требует компиляции.

Я предполагаю, что IIS7 достаточно умен, чтобы сохранить кэшированную копию представления (и скомпилированных лямбда-выражений) для будущего повторного использования, что означает, что последующие времена визуализации будут сопоставимы с V1 в IIS 6.

+0

предположение, что IIS7 является ключевым фактором здесь, не является правильным. Для получения правильной информации см. Ответ Леви. – thomasjo

+0

IIS7 был упомянут после того, как ответ был принят, поэтому я не могу его удалить :( – Codebrain