如何确定效率
本文关键字:效率 何确定 | 更新日期: 2023-09-27 18:29:17
如何比较这两次迭代以确定哪一次最有效?
Process.GetProcessesByName("EXCEL")
.Where(p => p.StartTime >= _createdOn)
.ToList()
.ForEach(p => p.Kill());
与
foreach (var proc in Process.GetProcessesByName("EXCEL").Where(p => p.StartTime >= _createdOn))
proc.Kill();
实际差异只能通过在精确情况下双向运行来确定,通过使用Stopwatch
或其他分析工具测量来确定,但以下是一些观察结果:
- 唯一真正的区别是对
ToList()
的调用,这对于使用.ForEach()
是必要的。除此之外,它们是等价的 - 由于我认为这不是经常运行的(你需要多长时间杀死一个Excel进程?),因此在这种情况下,性能差异应该无关紧要
- 您可能正在修复症状,而不是问题。我很好奇为什么你有多个excel流程需要杀死
它们几乎完全相同。这里的耗时操作是Process.GetProcessesByName("EXCEL")
、p.StartTime
和proc.Kill()
。在这两种情况下,你所做的数量是相同的。其他一切只需要很短的时间。如果你想在这里进行一些真正的优化,你可以尝试使用WinAPI来进行这些长操作,有时它工作得更快。
编辑:我之前为自己的项目测量过这些操作的速度。但我没有确切的数字,所以我再次检查了一遍。
这些是我的结果:
Process.GetProcessesByName():
DateTime start = DateTime.Now;
for (int i = 0 ; i < 1000 ; i++) {
Process.GetProcessesByName("chrome");
}
TimeSpan duration = DateTime.Now - start;
每1000个操作需要5秒。
p.Kill():
TimeSpan duratiom = TimeSpan.Zero;
for (int i = 0 ; i < 1000 ; i++) {
Process p = Process.Start("c:/windows/notepad");
DateTime start = DateTime.Now;
p.Kill();
duratiom += DateTime.Now - start;
}
每1000次操作需要300毫秒。仍然是一个很大的数字。
和StartTime,只需比较数字:
无p.StartTime:
Process[] ps = Process.GetProcessesByName("chrome");
DateTime start = DateTime.Now;
for (int i = 0 ; i < 1000 ; i++) {
ps.Where(p => true).ToList();
}
TimeSpan duratiom = DateTime.Now - start;
6毫秒
带p.StartTime:
Process[] ps = Process.GetProcessesByName("chrome");
DateTime start = DateTime.Now;
for (int i = 0 ; i < 1000 ; i++) {
ps.Where(p => p.StartTime < DateTime.Now).ToList();
}
TimeSpan duratiom = DateTime.Now - start;
408毫秒
所以,这些数字告诉我,优化是没有意义的。Where()、ToList()或foreach。无论如何,使用Process进行操作需要数十倍的时间。此外,我知道轮廓仪,我用它们来测量和优化,但我做这些例子是为了得到确切的数字并表明这一点。