代码之家  ›  专栏  ›  技术社区  ›  Doddler

在ASP。NET核心MVC

  •  8
  • Doddler  · 技术社区  · 8 年前

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

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

    为了隔离这个问题,我创建了一个新的asp。net核心MVC项目使用visual studio中的所有默认设置,无需身份验证。我创建了如下视图模型:

    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)
    }
    

    当运行这段代码时,需要花费超过一秒钟的时间!罪魁祸首是显示器。如果我按如下方式更改视图:

    @model List<DisplayForTest.ViewModels.TestingViewModel>
    
    @foreach (var item in Model)
    {
        @item.Id
        @item.TextValue1
        @item.TextValue2
    }
    

    这在13ms内呈现。很明显,DisplayFor为渲染添加了大量时间…在我的PC上,每次调用的时间接近0.4ms。虽然这在孤立情况下并不糟糕,但对于列表或其他东西来说,这是一个非常糟糕的选择。

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

    2 回复  |  直到 8 年前
        1
  •  3
  •   Will Ray    8 年前

    计算和执行lambda表达式需要一些开销。首先,框架必须: validate it 然后 evaluate it . 我在这里有点推测 ,但这似乎是性能问题的来源;这两种方法都需要反射。

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

    DisplayFor 可以处理两种最常见的用例(显示属性值和使用自定义模板显示属性值),并且在大多数情况下性能相当好。

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

        2
  •  3
  •   Michael Mittermair    6 年前

    在复盆子PI上使用.Net内核时,我遇到了同样的问题。演出非常糟糕。我使用了点跟踪,发现反射占用了大量时间。

    基于以下内容: article