如何提高方法的性能

时间:2012-07-18 20:03:02

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

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

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

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

我正在使用LINQ to EF。

6 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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,因为它是线程安全的。

答案 2 :(得分:1)

您正在寻找的是一个分析器 - 一个分析器运行您的程序并告诉您每行代码执行的时间,以及执行时间占总执行时间的百分比。

一个优秀的C#profiler是ANTS .Net Profiler,它相当昂贵,但它有14天免费试用 - 我认为这将是您的需求的完美。

答案 3 :(得分:1)

您有几种选择。我发现自己使用秒表来测试这种东西。在你做任何事之前,你确定代码的表现还不够好。如果它没有破坏不修复它往往是最好的建议。如果你仍然感兴趣,你可以做这件事:

Stopwatch sw = Stopwatch.StartNew();

// do some code stuff here

sw.Stop();

Console.WriteLine(sw.ElapsedTicks);

您还可以在sw变量中进行秒,毫秒和其他测量。

答案 4 :(得分:1)

我建议您使用JetBrains dottrace它有一些非常有用的功能,指向热点并告诉您哪段代码需要多长时间

PS:它几次挽救了我的脖子

答案 5 :(得分:0)

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

您可以使用分析器来分析程序。 SQL-Server有一个分析器,允许您监视查询。如果你想分析代码,google for .NET profilers你会发现很多有免费许可证的人。或者买一个,如果你发现它有用。 EQATEC profiler对我来说非常有用。

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