如何确定效率?

时间:2016-01-06 17:15:34

标签: c# lambda clr

如何比较这两个迭代以确定哪个最有效?

Process.GetProcessesByName("EXCEL")
    .Where(p => p.StartTime >= _createdOn)
    .ToList()
    .ForEach(p => p.Kill());

VS

foreach (var proc in Process.GetProcessesByName("EXCEL").Where(p => p.StartTime >= _createdOn))
    proc.Kill();

2 个答案:

答案 0 :(得分:-1)

实际差异只能通过使用Stopwatch或其他分析工具在确切情况下运行并测量来确定,但这里有一个几点意见:

  • 唯一真正的区别是调用ToList(),这是使用.ForEach()所必需的。除此之外,它们是等价的。
  • 因为我认为这不经常运行(你需要多久杀死一次Excel进程?)在这种情况下,性能差异应该是无关紧要的。
  • 您可能正在修复症状而不是问题。我很好奇为什么你有多个需要杀死的excel进程。

答案 1 :(得分:-1)

它们几乎完全一样。这里耗时的操作是Process.GetProcessesByName("EXCEL")p.StartTimeproc.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的操作需要花费数十倍的时间。此外,我了解剖析器,并使用它们进行测量和优化,但我做了这些示例以获得确切的数字并显示出来。