7

在我当前的应用程序中,我正在生成一个相当长的表格来显示给用户。我已经看到了一些严重的性能问题,我已经追踪到 @Html.DisplayFor 的使用,我不完全确定为什么。

编辑:我已经用更简洁和可重现的设置替换了代码示例。

为了隔离问题,我使用 Visual Studio 中的所有默认设置创建了一个新的 asp.net core MVC 项目,没有进行身份验证。我这样创建了一个视图模型:

public class TestingViewModel
{
    public int Id { get; set; }
    public string TextValue1 { get; set; }
    public string TextValue2 { get; set; }
}

然后添加了一个控制器,它用数据填充视图模型以传递给视图:

    public IActionResult TestThings()
    {
        var list = new List<TestingViewModel>();
        for(var i = 0; i < 1000; i++)
            list.Add(new TestingViewModel {Id = i, TextValue1 = "Test", TextValue2 = "Test2"});

        return View(list);
    }

视图是显示数据的最低限度:

@model List<DisplayForTest.ViewModels.TestingViewModel>

@foreach (var item in Model)
{
    @Html.DisplayFor(m => item.Id)
    @Html.DisplayFor(m => item.TextValue1)
    @Html.DisplayFor(m => item.TextValue2)
}

运行此代码时,运行时间超过一秒!罪魁祸首是DisplayFor。如果我按如下方式更改视图:

@model List<DisplayForTest.ViewModels.TestingViewModel>

@foreach (var item in Model)
{
    @item.Id
    @item.TextValue1
    @item.TextValue2
}

这会在 13 毫秒内呈现。很明显,DisplayFor 正在为渲染增加大量时间……在我的 PC 上,每次调用将近 0.4 毫秒。虽然这在孤立的情况下还不错,但对于列表或其他事情来说,它是一个非常糟糕的选择。

真的DisplayFor就这么慢吗?还是我使用不当?

4

2 回答 2

3

DisplayFor 真的有那么慢吗?还是我使用不当?

计算和执行 lambda 表达式需要一些开销。首先框架必须对其进行验证,然后对其进行评估我在这里推测了一下,但似乎这就是性能问题的来源;这两种方法都需要反思。

在您的示例中,我使用过的所有其他显示方法(ValueForDisplayTextFor等)都具有相同的性能效果。

我不能代表 MVC 团队说明为什么将它用于默认脚手架,但这对我来说确实有意义。DisplayFor可以处理两种最常见的用例(显示属性的值,以及使用自定义模板显示属性的值),并且在大多数情况下表现得相当好。

在这种情况下,我认为仅使用原始值(基本上.ToString是 ing 它)或根据您要查找的内容在Html.Encode/方法中使用它没有问题。Html.Raw

于 2016-10-14T01:19:51.453 回答
3

在 Raspberry PI 上使用 .Net Core,我遇到了同样的问题。表演真的很糟糕。我使用了 dotTrace,发现反射使用了很多时间。

根据以下文章,我能够加速应用程序。

于 2018-09-10T07:09:36.467 回答