如何确定效率

本文关键字:效率 何确定 | 更新日期: 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.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进行操作需要数十倍的时间。此外,我知道轮廓仪,我用它们来测量和优化,但我做这些例子是为了得到确切的数字并表明这一点。