Slow DisplayFor ASP.NET Core MVC中的性能

问题描述 投票:6回答:2

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

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

为了解决这个问题,我使用visual studio中的所有默认设置创建了一个新的asp.net核心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在我的电脑上添加了大量的时间......每次通话接近0.4毫秒。虽然这在隔离方面并不坏,但它使列表或其他东西成为一个非常糟糕的选择。

DisplayFor真的那么慢吗?还是我错误地使用它?

c# razor asp.net-core asp.net-core-mvc displayfor
2个回答
2
投票

DisplayFor真的那么慢吗?还是我错误地使用它?

评估和执行lambda表达式需要一些开销。首先框架必须validate it,然后evaluate it。我在这里猜测一下,但似乎这是性能问题的来源;这两种方法都需要反思。

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

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

在这种情况下,我没有看到只使用原始值(基本上是.ToStringing),或在Html.Encode / Html.Raw方法中使用它取决于你正在寻找的问题。


0
投票

在Raspberry PI上使用.Net Core,我遇到了同样的问题。表现非常糟糕。我使用dotTrace,发现反射大部分时间都在使用。

基于以下article,我能够加速应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.