C# 如何提高方法的性能

C# 如何提高方法的性能,c#,wcf,c#-4.0,entity-framework-4,C#,Wcf,C# 4.0,Entity Framework 4,我有一个很大的方法。 在这里,我进行了一些c#计算,还调用了3/4存储过程。 构造3/4个对象,最后添加列表并返回列表 我的目标是改进此方法的性能,以减少执行时间 我的问题是,有没有办法让我检查方法的每个部分,并找出哪个部分需要时间来执行?? 可能是失血过多之类的 我正在使用LINQ to EF。投资性能分析器,如。VisualStudio的一些更好的版本也附带了一个 至少,你可以尝试使用 从msdn: static void Main(string[] args) { Stopwatc

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

我的目标是改进此方法的性能,以减少执行时间

我的问题是,有没有办法让我检查方法的每个部分,并找出哪个部分需要时间来执行?? 可能是失血过多之类的


我正在使用LINQ to EF。

投资性能分析器,如。VisualStudio的一些更好的版本也附带了一个

至少,你可以尝试使用

从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);
}

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


一个很好的C#profiler是,它相当昂贵,但有14天的免费试用期-我认为这非常适合您的需要。

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

Stopwatch sw = Stopwatch.StartNew();

// do some code stuff here

sw.Stop();

Console.WriteLine(sw.ElapsedTicks);

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

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


PS:这几次节省了我的时间

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

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


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

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

它可能看起来像这样:

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结果=新的ConcurrentBag();
并行调用(
() => {
var db=新数据库实体();
结果result1=db.StoredProcudure1();
结果。添加(结果1);
}
() => {
var db=新数据库实体();
结果result2=db.StoredProcudure2();
结果:添加(结果2);
}
() => {
var db=新数据库实体();
结果result3=db.StoredProcudure3();
结果。添加(结果3);
}
);
返回结果;

我在这里使用的是
ConcurrentBag
而不是
List
,因为它是线程安全的。

如果您想记录它,您可能会对
Stopwatch
类感兴趣。此外,如果您认为有一点可能会出现问题,请将其张贴出来,有人可能会看到它运行缓慢的原因。您可以始终对代码的每个部分分别计时,但是这看起来是一个很好的使用示例分析的情况。如果您认为某些东西比应该的慢,那么为什么不在秒表上获取代码是第一个选择。谢谢。我试试看。它是一个wcf,客户端是iPhone。它将在大约3秒钟内返回数据,但要求更快。很好!真像这样+1.