使用IEnumerable的显示模板会导致缓慢吗?

时间:2015-03-26 13:58:31

标签: c# asp.net-mvc performance templates

所以我决定在这里看到关于&#34;纠正&#34;的众多帖子。使用IEnumerable<T>时使用显示模板的方法。

我有一个正在创建的表,对于行,我创建了一个单独的显示模板。在这种情况下,模型是IEnumerable<PartTest>

<table>
    <thead>
        <tr>
            <th>Job Number</th>
            <th>Part Number</th>
            <th>Tester</th>
            <th>Pass / Fail</th>
            <th>Test Date</th>
        </tr>
    </thead>
    <tbody>
        @if (Model.Any())
        {
            using (MiniProfiler.Current.Step("Render Table"))
            {
                Html.DisplayFor(model => model);
            }
        }
        else
        { 
            <tr>
                <td colspan="5">No results - update search fields</td>
            </tr>
        }
    </tbody>
</table>

模板:

@model PartTest

<tr>
    <td>@Html.DisplayFor(model => model.JobNumber)</td>
    <td>@Html.DisplayFor(model => model.PartNumber)</td>
    <td>@Html.DisplayFor(model => model.Tester)</td>
    <td>
        @if (Model.IsPassing)
        {
            <div class="label label-success label-small">Passed</div>
        }
        else
        {
            <div class="label label-danger label-small">Failed</div>
        }
    </td>
    <td>@Html.DisplayFor(model => model.TestDate)</td>
</tr>

我正在使用区域,因此路径为~/Areas/PartsTesting/Views/Shared/PartTest.cshtml。 当我运行它时,它运行速度非常慢。我的意思是有时10-15秒。数据集并不令人愤慨,但有时它可能超过100个项目,在这种情况下我提供了一个滚动条,但我并不认为渲染100行会导致这种缓慢。

当我切换到只是手动迭代for循环中的项目并一起跳过显示模板时,它在~40ms内运行了200多个项目。这里发生了什么?当我使用显示模板时,为什么这么慢(从我读过的是#34;更好的&#34;为MVC编写的方式)?

1 个答案:

答案 0 :(得分:0)

http://forums.asp.net/t/1614418.aspx?+Html+DisplayFor+item+item+Property+extremely+slow

中所述

“打开调试时,我们不会将视图名称中的映射缓存到视图文件”

“设置debug = true会禁用优化的代码路径以协助调试。在您的特定情况下,它会禁用视图位置缓存。”

似乎每次调用Html.DisplayFor都会搜索匹配的模板。显然这个文件操作,以及所有附带的检查文件是否存在等都很慢。

将debug设置为false将优化此问题。

虽然个人...... 我建议你尝试使用Html.RenderPartial而不是Html.DisplayFor。

虽然,专家意见认为这会遇到同样的问题。我一直讨厌模板并认为它们是“老skool”