1

tl;dr在 VS2012 中以调试模式运行时,在 MVC 中显示包含大量记录和每条记录 4 个渲染链接的视图需要很长时间才能加载。

我有一个 ASP.NET MVC4 Web 应用程序,其中一个视图显示一个包含 300 条记录的表。每当我在 VS2012 中以调试模式运行应用程序时,加载此视图需要将近 2 分钟。该表有 4 个由 HTML.ActionLink 或 URL.Action 生成的唯一链接。通过测试,我知道这些链接的生成是有问题的代码。

慢代码示例:

<table>
<thead>
    <tr>
        <th></th>
        <th></th>
    </tr>
</thead>
<tbody>
    @foreach (var item in Model) {
    <tr>
        <td>Bob</td>
        <td>
    Tony
            <div style="margin-top: 5px;">
                <a href="@Url.Action("Edit", "Home", new { id = item.Id })" class="btn btn-mini" title="Edit"><i class="icon-edit"></i></a>
                <a href="@Url.Action("Details", "Home", new { id = item.Id })" class="btn btn-mini" title="Details"><i class="icon-file"></i></a>
                <a href="@Url.Action("Delete", "Home", new { id = item.Id })" class="btn btn-mini" title="Delete"><i class="icon-trash"></i></a>
            </div>
            <div style="margin-top: 5px;">
                @Html.ActionLink("Do Something", "SomeAction", "SomeController", new { id = item.Id }, new { @class = "btn btn-success btn-mini", data_pe_type = "auto" })
            </div>
        </td>
    </tr>
    }
</tbody>

如果我修改代码并在 foreach 之外构建链接的基本部分,加载时间将减少到 15 秒。

更快的代码示例:

<table>
<thead>
    <tr>
        <th></th>
        <th></th>
    </tr>
</thead>
<tbody>
    @{
        var editLink = Url.Action("Edit", "Home") + "/";
        var detailsLink = Url.Action("Details", "Home") + "/";
        var deleteLink = Url.Action("Delete", "Home") + "/";
        var saLink = Url.Action("SomeAction", "SomeController") + "/";
    }
    @foreach (var item in Model) {
    <tr>
        <td>Bob</td>
        <td>
    Tony
            <div style="margin-top: 5px;">
                <a href="@editLink@item.Id" class="btn btn-mini" title="Edit"><i class="icon-edit"></i></a>
                <a href="@detailsLink@item.Id" class="btn btn-mini" title="Details"><i class="icon-file"></i></a>
                <a href="@deleteLink@item.Id" class="btn btn-mini" title="Delete"><i class="icon-trash"></i></a>
            </div>
            <div style="margin-top: 5px;">
                <a href="@saLink@item.Id" class="btn btn-success btn-mini" data-pe-type="auto">Do Something</a>
            </div>
        </td>
    </tr>
    }
</tbody>

我正在使用 IIS Express,并在 Windows 7 上的 IE10 和 Chrome 27 中对此进行了测试。在 Chrome 中,我禁用了 IPv6。这仅在调试期间发生。我还让一位同事在他们的机器上测试了相同的代码,他们遇到了同样的问题。

我已经通过将基本链接生成移到 foreach 之外解决了性能问题,但现在想知道为什么调试导致我的原始代码呈现如此缓慢。

4

1 回答 1

0

缓存被禁用,Debug=true.这将导致许多级别的性能问题,包括路由/动作解析、视图/部分视图位置解析和解析等。在发布模式 ( Debug=false) 下整体部署应用程序将提高性能高达 10 倍,尤其是对于使用的大型循环在视图中。

于 2016-07-01T14:21:35.363 回答