1

我正在使用redgate 性能分析器来测试我的 asp.net mvc 2 应用程序。我发现其中一件事是 XMLSerializer 占用了过多的 CPU 时间,因此请参阅这篇文章。我将其更改为XmlSerializerCache现在使用的位置。

现在 XmlSerializer 问题不再存在,我通过使用带有 Jmeter 的网站同时模拟 80 个用户来分析应用程序。因此,现在需要时间的顶级方法正在FirstOrDefault()对我正在提取的一些数据进行操作,我将举个例子-

var values=(from c in DataContext.Table1
           join s in DataContext.Table2 on new { c.Id, c.date } 
            equals new { s.Id, s.date } into list
                          where c.Id== Id && c.date == date
                          from s in list.DefaultIfEmpty()
                          select new DayDTO()
                          {
                              Points = c.points,
                              Points1 = c.points1,
                              Points2 = c.points2,
                              Points3 = c.points3,
                              Points4 = c.points4
                          }).FirstOrDefault();

谁能建议我可以做些什么来改善这一点?当前时间是 25 秒和前 2 种方法的 16 秒.. 是否只是因为我同时模拟 80 个用户并且数据库(sql server 2005)方面存在一些问题,例如表太大和索引等等...我会调查的,但目前我正在尝试确定您在代码中看到的任何问题,即 C# 方面的问题..

我将不胜感激任何帮助谢谢!

4

2 回答 2

2

这假设顶部时间是“包含时间”,而不是“排除时间”。

包含时间意味着它包含方法调用的任何代码,在这种情况下,FirstOrDefault将执行数据库调用。数据库调用在延迟的情况下代价高昂,但 CPU 线程在等待数据库调用时被阻塞并且不使用 CPU。

首先,您应该问自己这是否是一个问题,它不会显着影响吞吐量(假设数据库服务器可以处理负载),但会影响您的调用延迟。

如果这是一个问题,您需要加快实际 SQL 查询的速度。您应该启动 SQL 探查器,捕捉实际问题,然后在 SQL 管理工作室中运行它。查看执行计划以查看查询是否比预期慢,并尝试找出原因。如果它太慢,您可以检查您的索引开始。

于 2010-12-01T18:39:05.503 回答
1

FirstOrDefault 可能被称为罪魁祸首,仅仅是因为它是在您的案例中强制枚举的方法。如果你在它之前加入一个.ToList(),你会发现负担转移到了.ToList()。

于 2010-12-01T18:39:41.003 回答