gpt4 book ai didi

c# - 为什么 ASP.NET MVC View 中的 foreach 循环如此缓慢?

转载 作者:太空宇宙 更新时间:2023-11-03 22:25:37 25 4
gpt4 key购买 nike

我在我的 View 中使用 foreach 来循环我的强类型模型并显示一个表格。只有 25 行和 7 列,大约需要 280 毫秒。这似乎很慢。在 View 中使用循环是否有一些我应该知道的性能技巧?

编辑:我的 Controller 从 Azure 表中获取数据并使用 ViewModel 模式将其提供给 View 。我不知道这是否重要,但我的 View 是在 VB 中,而我的模型是在 C# 中。所以,他们在不同的项目中。我会想出一个精简的例子来发布,但我现在快要出门了,今晚晚些时候必须完成这个。我希望我能在人们周末回家之前 catch StackOverflow 的人群,所以我的原始帖子很快就发布了,没有示例代码。

编辑:我向 Fiddler 确认没有发生延迟加载。在 View 呈现期间没有 Fiddler 事件。

编辑:如果我将 Azure 表中的数据提供给 View ,则需要 280 毫秒。如果我用看起来就像来自 Azure 表的真实数据的虚假数据提供同一个 View ,则需要 60 毫秒。在任何一种情况下,Controller 都只是填充一个 ViewModel 对象并将其传递给 View。两个实例中使用相同的 ViewModel 类。我不明白。

编辑:我想我明白了。如果我一开始就包含代码,这对其他人来说可能是显而易见的。这是我的 ViewModel:

public class EmployeeChildrenViewModel
{
public Employee employee;
public IEnumerable<Child> children;
}

如果我将上面的 ViewModel 传递给我的 View ,foreach 需要 280 毫秒。如果我首先用 children.ToList() 填充上面的 ViewModel,那么 View 只需要 60 毫秒。然而,经过进一步调查,我发现两种情况下的整体页面加载时间是相同的。我想如果 IEnumerable 在我的 Controller 或我的 View 中迭代并不重要,因为整体效果是相同的。我仍然不确定遍历 children 会做什么,因为我确定它在那个时候没有访问数据库,正如 Fiddler 所确认的那样。

最佳答案

您使用的是 Linq-to-SQL 还是默认情况下延迟加载的其他 ORM?

我建议记录所有数据库调用(datacontext.Log = 一些继承自 TextWriter 的类)并检查当您在看法。

编辑:看来以下信息与这个问题无关,但我会把它留在这里,因为它可能对某人有用:

假设您在这里使用的是 Linq-to-SQL(如果不是这种情况,我将对其进行编辑):

当你的模型 foo 有一个关联 Bar(所以 foo.Bar)并且你没有在数据上下文中指定任何 LoadOptions 时,Bar 是延迟加载的(所以:调用时加载,就像你的 View 中可能发生的那样)这意味着 View 本质上进入数据库。每一行都会发生这种情况。

做类似下面的事情:

DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Foo>(f => f.Bar);
context.LoadOptions = options;

此外,为了防止这种情况,请尝试将您的 DataContext 包装在 using 语句中:

using(DataContext context = new DataContext())
{
}

当延迟加载某些关联时,您的 View 现在将生成异常,因为 DataContext 现在将被释放并且不可用于数据库操作。

关于c# - 为什么 ASP.NET MVC View 中的 foreach 循环如此缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1546044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com