5

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) が非常に高速になります。問題は解決しましたが、理由を知りたいです。:)

ありがとう、
ソエモエ

4

2 に答える 2

12

キャッシングはリリース モードでのみ有効です。アプリケーションをデバッグ モードで実行すると、ディスク アクセスが原因でパフォーマンスが低下することがあります。

参照: http://codeclimber.net.nz/archive/2009/04/22/how-to-improve-htmlhelper.renderpartial-performances-donrsquot-run-in-debug-mode.aspx

于 2009-11-11T19:40:18.167 に答える
0

問題は、 DisplayFor() が、実行時にコンパイルおよび実行されるラムダ式を使用することです。

したがって、V1 でのパフォーマンスの違いは、この「中間」コンパイル手順に起因する可能性があります。

V2 は、コンパイルを必要としない単純なプロパティ アクセスです。

ここで推測していますが、IIS7 は将来の再利用のためにビュー (およびコンパイルされたラムダ式) のキャッシュ コピーを保持するのに十分スマートであると想像しています。つまり、その後のレンダリング時間は IIS 6 の V1 に匹敵します。 .

于 2009-11-10T16:16:26.397 に答える