Asp.net Отображение Mvc 2 Из-за проблемы с производительностью?

StackOverflow https://stackoverflow.com/questions/1709103

  •  19-09-2019
  •  | 
  •  

Вопрос

В моем недавнем проекте, который использует 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 (нет проблем с производительностью)

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

Редактировать:Когда я развертываю свой локальный IIS 7 (с версией выпуска), и это (V1) становится очень быстрым.Проблема решена, но я все еще хочу знать причину.:)

Спасибо,
Соэ Мо

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top