在我目前的应用程序中,我生成一个相当冗长的表格以显示给用户。我已经看到了一些严重的性能问题,我已经跟踪了@ 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
真的那么慢吗?或者我使用不正确?
答案 0 :(得分:2)
DisplayFor真的那么慢吗?或者我使用不正确?
评估和执行lambda表达式需要一些开销。首先,框架必须validate it,然后是evaluate it。 我在这里推测,但似乎这可能是性能问题的来源;这两种方法都需要反思。
我使用的所有其他显示方法(ValueFor
,DisplayTextFor
等)在您的示例中都具有相同的效果。
我不能代表MVC团队为什么将它用于默认的脚手架,但它确实对我有意义。 DisplayFor
可以处理两种最常见的用例(显示属性的值,并使用自定义模板显示属性的值),并且在大多数情况下表现相当不错。
在这种情况下,我没有看到仅使用原始值(基本上是.ToString
)或在Html.Encode
/ Html.Raw
方法中使用它的问题,具体取决于你在寻找什么。
答案 1 :(得分:0)
在Raspberry PI上使用.Net Core,我遇到了同样的问题。性能真的很差。我使用了dotTrace,发现反射花费了很多时间。
基于以下article,我能够加快应用程序的速度。