如何比较这两个迭代以确定哪个最有效?
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();
答案 0 :(得分:-1)
实际差异只能通过使用Stopwatch
或其他分析工具在确切情况下运行并测量来确定,但这里有一个几点意见:
ToList()
,这是使用.ForEach()
所必需的。除此之外,它们是等价的。 答案 1 :(得分:-1)
它们几乎完全一样。这里耗时的操作是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的操作需要花费数十倍的时间。此外,我了解剖析器,并使用它们进行测量和优化,但我做了这些示例以获得确切的数字并显示出来。