2012-07-18 65 views
2

我有一个很大的方法。 其中我有一些C#计算,我也打电话3/4存储过程。 构建3/4对象并最终添加到列表中并返回列表。如何提高方法的性能

我的目标是提高此方法的性能,以便执行时间更短。

我的问题是,有什么办法可以检查方法的每个部分,并找出哪个部分需要时间来执行? 可能是一些looging或东西!

我正在使用LINQ to EF。

+0

如果你想记录它,'Stopwatch'类可能是你感兴趣的。另外,如果有一点你认为可能是一个问题,那么有人可能会发现它运行缓慢的原因。 – KingCronus 2012-07-18 20:06:36

+1

您总是可以分别对每段代码进行计时,但这看起来像是使用样本分析的一个很好的情况。 – Thomas 2012-07-18 20:06:43

+0

为什么不在http://codereview.stackexchange.com/上获取您的代码 – HatSoft 2012-07-18 20:07:55

回答

3

投资性能分析器,如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); 
} 
+0

如果您认为某件事比预想的要慢,则秒表是您的第一个选择。 – 2012-07-18 20:19:49

1

什么你要找的是一个分析器 - 探查器中运行你的程序,并告诉你有多少时间每行的代码需要执行,以及执行时间占总执行时间的百分比。

一个很棒的C#探查器是ANTS .Net Profiler,它相当昂贵,但它有14天的免费试用 - 我认为这对你的需求是完美的。

1

你有几个选择。我发现自己使用停止手表来测试这种事情。在你做任何事之前,你必须确保代码已经不够好。如果没有损坏,不要修复它往往是最好的建议。如果你仍然感兴趣,你可以做这样的事情:

Stopwatch sw = Stopwatch.StartNew(); 

// do some code stuff here 

sw.Stop(); 

Console.WriteLine(sw.ElapsedTicks); 

你也有秒,毫秒和其他测量在sw变量。

+0

谢谢。我会尝试。这是一个wcf,客户端是iPhone。它在3秒内返回数据,但要求更快。 – kandroid 2012-07-18 20:33:25

1

我的建议是你用JetBrains dottrace它有一定的指向热点,告诉你哪个一段代码已经采取多久

PS非常有益的功能:它救了我的脖子几次

0

数据库访问通常比您可能做出的任何计算都慢几个数量级(除非您正在尝试预测未来天气)。因此,LINQ-to-EF部分很可能在时间流逝的地方丢失。

您可以使用分析器来分析程序。 SQL-Server有一个分析器,允许您监视查询。如果你想分析代码,谷歌的.NET分析器,你会发现不少有一个免费的许可证。或者购买一个,如果你觉得它有用。 EQATEC profiler对我来说非常有用。

如果你有一个很大的方法,你的代码结构严重不足。制定一个大方法不会比将其分解成更小的逻辑部分更快。较小的部分将更容易维护,并且代码分析器将产生更多有用的信息,因为它们通常只返回方法调用总数,并且不显示单行代码的时间。

3

如果可能,您可以尝试并行执行存储过程。我已经看到这种性能提高了很多,特别是如果您的存储过程只是读取而没有写入。

它可能是这个样子:

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的,因为它是线程安全的。

+0

不错!真的很喜欢这个! +1 – 2012-07-18 21:09:27