【问题标题】:How to improve performance of a method如何提高方法的性能
【发布时间】:2012-07-18 20:03:02
【问题描述】:

我有一个相当大的方法。 我有一些 c# 计算,而且我正在调用 3/4 存储过程。 构造 3/4 个对象,最后添加一个列表并返回该列表。

我的目标是提高这种方法的性能,从而减少执行时间。

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

我正在使用 LINQ to EF。

【问题讨论】:

  • 如果您想记录 Stopwatch 类,您可能会对它感兴趣。此外,如果有一点您认为可能有问题,请将其发布,并且有人可能会看到它运行缓慢的原因。
  • 您总是可以分别对每个代码部分进行计时,但这看起来是使用示例分析的好情况。
  • 为什么不在codereview.stackexchange.com上获取您的代码

标签: c# wcf c#-4.0 entity-framework-4


【解决方案1】:

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

【讨论】:

  • 如果您认为某事比应有的速度慢,秒表是第一个选择。
【解决方案2】:

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

它可能看起来像这样:

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
【解决方案3】:

您正在寻找的是探查器 - 探查器会运行您的程序并告诉您执行每行代码所花费的时间,以及执行时间占总执行时间的百分比。

ANTS .Net Profiler 是一个很棒的 C# 分析器,它相当昂贵,但它有 14 天的免费试用期 - 我认为这将非常适合您的需求。

【讨论】:

    【解决方案4】:

    您有多种选择。我发现自己使用秒表来测试这种东西。但是,在您做任何事情之前,您确定代码的性能还不够好。如果它没有损坏,请不要修复它通常是最好的建议。如果你仍然感兴趣,你可以这样做:

    Stopwatch sw = Stopwatch.StartNew();
    
    // do some code stuff here
    
    sw.Stop();
    
    Console.WriteLine(sw.ElapsedTicks);
    

    在 sw 变量中还有秒、毫秒和其他测量值。

    【讨论】:

    • 谢谢。我会试试。它是一个 wcf,客户端是 iPhone。它在大约 3 秒内返回数据,但要求是让它更快..
    【解决方案5】:

    我的建议是您使用JetBrains dottrace,它有一些非常有用的功能,可以指出热点并告诉您哪段代码花费了多长时间

    PS:它救了我几次脖子

    【讨论】:

      【解决方案6】:

      数据库访问通常比您可能进行的任何计算慢几个数量级(除非您尝试预测明天的天气)。因此,LINQ-to-EF 部分很可能是浪费时间的地方。

      您可以使用分析器来分析程序。 SQL-Server 有一个分析器,允许您监视查询。如果你想分析代码,谷歌搜索 .NET profilers,你会发现很多有免费许可证的。或者买一个,如果你觉得有用的话。 EQATEC profiler 对我很有用。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-28
        • 1970-01-01
        • 2011-12-19
        • 2018-11-06
        • 1970-01-01
        • 2011-06-27
        • 2019-03-20
        • 1970-01-01
        相关资源
        最近更新 更多