我有一个相当大的方法。我有一些 c# 计算,而且我正在调用 3/4 存储过程。构造 3/4 个对象,最后添加一个列表并返回该列表。
我的目标是提高这种方法的性能,以减少执行时间。
我的问题是,有什么方法可以让我检查方法的每个部分并找出哪个部分需要时间来执行?可能是一些 looging 什么的!
我正在使用 LINQ to EF。
我有一个相当大的方法。我有一些 c# 计算,而且我正在调用 3/4 存储过程。构造 3/4 个对象,最后添加一个列表并返回该列表。
我的目标是提高这种方法的性能,以减少执行时间。
我的问题是,有什么方法可以让我检查方法的每个部分并找出哪个部分需要时间来执行?可能是一些 looging 什么的!
我正在使用 LINQ to EF。
投资一个性能分析器,比如Redgate 的 Ants。一些更好的 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);
}
如果可能,您可以尝试并行执行存储过程。我已经看到这大大提高了性能,特别是如果您的存储过程只进行读取而不写入。
它可能看起来像这样:
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
这里使用 a 而不是 aList
因为它是线程安全的。
您正在寻找的是探查器 - 探查器运行您的程序并告诉您执行每行代码所花费的时间,以及执行时间占总执行时间的百分比。
ANTS .Net Profiler是一个很棒的 C# 分析器,它相当昂贵,但它有 14 天的免费试用期 - 我认为这将非常适合您的需求。
你有几个选择。我发现自己使用秒表来测试这种东西。但是,在您做任何事情之前,您确定代码的性能还不够好。如果它没有损坏,请不要修复它通常是最好的建议。如果你仍然感兴趣,你可以做这样的事情:
Stopwatch sw = Stopwatch.StartNew();
// do some code stuff here
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
sw 变量中还有秒、毫秒和其他测量值。
我的建议是让您使用JetBrains dottrace它有一些非常有用的功能,可以指出热点并告诉您哪段代码花费了多长时间
PS:它救了我几次脖子
数据库访问通常比您可能进行的任何计算慢几个数量级(除非您尝试预测明天的天气)。因此,LINQ-to-EF 部分很可能是时间丢失的地方。
您可以使用分析器来分析程序。SQL-Server 有一个分析器,允许您监视查询。如果你想分析代码,谷歌搜索 .NET profilers,你会发现很多有免费许可证的。或者买一个,如果你觉得有用的话。EQATEC 分析器对我来说非常有用。
如果你有一个大方法,你的代码结构很糟糕。制作一个大方法并不比将其拆分成更小的逻辑部分更快。较小的部分将更易于维护,并且代码分析器将产生更多有用的信息,因为它们通常只返回方法调用总数并且不显示单行代码的时间。