C# 如何提高方法的性能
我有一个很大的方法。 在这里,我进行了一些c#计算,还调用了3/4存储过程。 构造3/4个对象,最后添加列表并返回列表 我的目标是改进此方法的性能,以减少执行时间 我的问题是,有没有办法让我检查方法的每个部分,并找出哪个部分需要时间来执行?? 可能是失血过多之类的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
我正在使用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.