我有一个很大的方法。 其中我有一些C#计算,我也打电话3/4存储过程。 构建3/4对象并最终添加到列表中并返回列表。如何提高方法的性能
我的目标是提高此方法的性能,以便执行时间更短。
我的问题是,有什么办法可以检查方法的每个部分,并找出哪个部分需要时间来执行? 可能是一些looging或东西!
我正在使用LINQ to EF。
我有一个很大的方法。 其中我有一些C#计算,我也打电话3/4存储过程。 构建3/4对象并最终添加到列表中并返回列表。如何提高方法的性能
我的目标是提高此方法的性能,以便执行时间更短。
我的问题是,有什么办法可以检查方法的每个部分,并找出哪个部分需要时间来执行? 可能是一些looging或东西!
我正在使用LINQ to EF。
投资性能分析器,如Ants from Redgate。一些更好的Visual Studio版本也附带了一个。
至少,你可以尝试使用System.Diagnostics.Stopwatch
从MSDN:
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds/10);
Console.WriteLine("RunTime " + elapsedTime);
}
如果您认为某件事比预想的要慢,则秒表是您的第一个选择。 – 2012-07-18 20:19:49
什么你要找的是一个分析器 - 探查器中运行你的程序,并告诉你有多少时间每行的代码需要执行,以及执行时间占总执行时间的百分比。
一个很棒的C#探查器是ANTS .Net Profiler,它相当昂贵,但它有14天的免费试用 - 我认为这对你的需求是完美的。
你有几个选择。我发现自己使用停止手表来测试这种事情。在你做任何事之前,你必须确保代码已经不够好。如果没有损坏,不要修复它往往是最好的建议。如果你仍然感兴趣,你可以做这样的事情:
Stopwatch sw = Stopwatch.StartNew();
// do some code stuff here
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
你也有秒,毫秒和其他测量在sw变量。
谢谢。我会尝试。这是一个wcf,客户端是iPhone。它在3秒内返回数据,但要求更快。 – kandroid 2012-07-18 20:33:25
我的建议是你用JetBrains dottrace它有一定的指向热点,告诉你哪个一段代码已经采取多久
PS非常有益的功能:它救了我的脖子几次
数据库访问通常比您可能做出的任何计算都慢几个数量级(除非您正在尝试预测未来天气)。因此,LINQ-to-EF部分很可能在时间流逝的地方丢失。
您可以使用分析器来分析程序。 SQL-Server有一个分析器,允许您监视查询。如果你想分析代码,谷歌的.NET分析器,你会发现不少有一个免费的许可证。或者购买一个,如果你觉得它有用。 EQATEC profiler对我来说非常有用。
如果你有一个很大的方法,你的代码结构严重不足。制定一个大方法不会比将其分解成更小的逻辑部分更快。较小的部分将更容易维护,并且代码分析器将产生更多有用的信息,因为它们通常只返回方法调用总数,并且不显示单行代码的时间。
如果可能,您可以尝试并行执行存储过程。我已经看到这种性能提高了很多,特别是如果您的存储过程只是读取而没有写入。
它可能是这个样子:
ConcurrentBag<Result> results = new ConcurrentBag<Result>();
Parallel.Invoke(
() => {
var db = new DatabaseEntities();
Result result1 = db.StoredProcudure1();
results.Add(result1);
}
() => {
var db = new DatabaseEntities();
Result result2 = db.StoredProcudure2();
results.Add(result2);
}
() => {
var db = new DatabaseEntities();
Result result3 = db.StoredProcudure3();
results.Add(result3);
}
);
return results;
我使用的是ConcurrentBag
这里,而不是一个List
的,因为它是线程安全的。
不错!真的很喜欢这个! +1 – 2012-07-18 21:09:27
如果你想记录它,'Stopwatch'类可能是你感兴趣的。另外,如果有一点你认为可能是一个问题,那么有人可能会发现它运行缓慢的原因。 – KingCronus 2012-07-18 20:06:36
您总是可以分别对每段代码进行计时,但这看起来像是使用样本分析的一个很好的情况。 – Thomas 2012-07-18 20:06:43
为什么不在http://codereview.stackexchange.com/上获取您的代码 – HatSoft 2012-07-18 20:07:55