在我最近使用Asp.net Mvc 2的项目中,我们发现DisplayFor存在性能问题。我不确定这是真正的问题还是我错过了什么?
我希望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之间的性能差异。
编辑:当我部署到我的本地IIS 7(发布版本)时,它(V1)变得非常快。问题解决了,但我仍然想知道原因。 :)
谢谢,
Soe Moe
答案 0 :(得分:12)
仅在发布模式下启用缓存。如果在调试模式下运行应用程序,则可能会因磁盘访问而导致性能下降。
答案 1 :(得分:0)
问题在于DisplayFor()使用在运行时编译和执行的lambda表达式。
因此,V1中的性能差异可归因于此“中间”编译步骤。
V2只是一个不需要任何编译的属性访问。
我在这里猜测,但我认为IIS7足够聪明,可以保留视图的缓存副本(以及编译的lambda表达式)以备将来重用,这意味着后续渲染时间将与V1相媲美在IIS 6中。