2009-10-09 56 views
1

我在我的视图中使用foreach来遍历我的强类型模型并显示一个表。只有25行和7列,大约需要280毫秒。这似乎很慢。有什么性能诀窍,我应该知道在视图中使用循环?为什么我的foreach在ASP.NET MVC视图中循环如此缓慢?

编辑:我的控制器从Azure表中获取数据并使用ViewModel模式将其提供给视图。我不知道这是否重要,但我的视图是在VB中,我的模型是在C#中。所以,他们在单独的项目。我会想出一个精简的例子来发布,但我现在已经走出了门,今晚晚些时候将不得不去做这件事。我希望在人们周末回家之前赶上StackOverflow的人群,所以我原来的帖子很快就没有示例代码。

编辑:我确认与提琴手,没有懒加载发生。视图渲染过程中没有Fiddler活动。

编辑:如果我用Azure表中的数据提供视图,则需要280毫秒。如果我使用与Azure表中的实际数据相似的假数据提供相同的视图,则需要60毫秒。无论哪种情况,Controller都会填充ViewModel对象并将其传递给View。两个实例都使用相同的ViewModel类。我不明白。

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

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

如果我通过上面的视图模型以我看来,foreach需要280毫秒。如果我先用children.ToList()填充上面的ViewModel,那么视图只需要60毫秒。但是,经过进一步调查,我发现无论哪种情况,整个页面加载时间都是相同的。我猜这是没有关系,如果IEnumerable迭代在我的控制器或我的看法,因为整体效果是相同的。我仍然不确定在children上迭代的结果是什么,因为我确信它不会触及数据库,正如Fiddler所确认的那样。

+1

告诉我们你遍历什么,也许这是很重的东西,你没有意识到这一点。你没有给我们关于这个问题的信息。 – Karl 2009-10-09 21:09:10

+0

向我们展示一些代码? – 2009-10-09 21:11:17

+0

@ eu-ge-ne&@Karl:对不起,我一开始应该这样做。代码现在发布。 – royco 2009-10-10 17:28:59

回答

4

您是否正在使用Linq-to-SQL或其他默认加载的ORM?

我建议记录所有数据库调用(datacontext.Log =继承自TextWriter的某些类),并检查当您在View中迭代它们时是否延迟加载关联。

编辑:看来下面的信息是不相关的这个问题,但我会离开这里,因为它可能是有用的人:

要去假设你正在使用LINQ到SQL在这里(如果不是这种情况,我会编辑它):

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

这样做以下:

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

此外,为了防止这种情况,请尝试在using声明包裹你的DataContext:

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

现在视图就会产生一个异常时,一些关联因为DataContext现在将被丢弃并且不可用于数据库操作。

+0

感谢您的回答。虽然我不使用LINQ到SQL,而且也没有懒惰加载发生在我的观点,你的帖子启发我尝试一些其他的事情,导致部分解释。 – royco 2009-10-10 17:33:00

0

获取.NET 4.0 beta和VS 2010测试版,并使用

Parallel.Foreach()

编辑:上面的回答应该是稍微讽刺。虽然这不是真正的解决方案,但是一旦您在VS 2010中获得TPL的好处,您会明白我的意思。

实际上,你在循环什么,你在循环中究竟做了什么,它实际上取决于你的代码结构,数据结构等等。需要更多的信息来获得比上述更少的嘲讽答案。

+2

那么,“狗慢”速度的两倍还是比较慢。不是解决问题的办法,而是解决症状的办法。 – JulianR 2009-10-09 21:09:13

+1

我不知道如果解决方案转向并行计算。 – 2009-10-09 21:09:21

+0

@JulianR - 比快1000倍“狗慢”并不完善的一个普遍问题的复杂性,但我肯定会更喜欢使用1000×更快的版本的任何一天。 – Sev 2009-10-09 21:12:24

0

这是否真的只发生在视图中?也许在迭代过程中执行数据库加载会降低整个过程的速度。你有一些延迟加载实施?您应该在该过程中检查数据库活动。

+0

是,性能问题在一个视图中只在一个循环。我使用提琴手检查我查看有什么数据库活动,它不感谢您的文章,虽然 – royco 2009-10-10 03:24:27

+0

@Slack:。?。小提琴手将如何帮助您检查DB活动 – UpTheCreek 2011-05-15 17:30:16

相关问题