ASP中显示速度慢.. NET Core MVC



在我当前的应用程序中,我生成了一个相当长的表来显示给用户。我发现它有一些严重的性能问题,我将其归咎于@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
}

渲染时间为13ms。很明显DisplayFor增加了大量的渲染时间…在我的电脑上,每次通话耗时将近0.4毫秒。虽然这在单独的情况下并不坏,但对于列表或其他东西来说,这是一个非常糟糕的选择。

DisplayFor真的那么慢吗?还是我用错了?

DisplayFor真的那么慢吗?还是我用错了?

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

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

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

在这种情况下,我不认为仅仅使用原始值(基本上是.ToString)有问题,或者在Html.Encode/Html.Raw方法中使用它,这取决于你正在寻找什么。

在Raspberry PI上使用。net Core时,我遇到了同样的问题。演出糟透了。我使用了dotTrace,发现反射占用了很多时间。

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

相关内容

  • 没有找到相关文章

最新更新