我有一个很大的方法。 我有一些c#计算,我也在调用3/4存储过程。 构造3/4对象,最后添加一个列表并返回列表。
我的目标是提高此方法的性能,以便花费更少的时间来执行。
我的问题是,有什么方法可以检查方法的每个部分,并找出哪个部分需要时间来执行? 可能是一些懒散的东西!!
我正在使用LINQ to EF。
答案 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对我来说非常有用。
如果你有一个很大的方法,你的代码结构很糟糕。制定一个大方法并不会比将它拆分成更小的逻辑部分更快。较小的部件将更易于维护,代码分析器将产生更多有用的信息,因为它们通常只返回方法调用总数而不显示单行代码的时间。