2016-01-06 32 views
-3

如何比較這兩個迭代來確定哪個最有效?如何確定效率?

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(); 
+5

用診斷名稱空間中的秒錶(假設您是手動指定的)計時。不過,您可以在VS中使用某些工具,這可以讓您分析代碼。 –

+1

但要小心過早的優化。除非您看到重大的性能問題,否則很可能不是問題。 –

+0

[半相關博客文章](http://ericlippert.com/2012/12/17/performance-rant/) - 或許不是第一點,而是關於它是否值得擔心的問題。 –

回答

-1

實際差異只能通過運行這兩種方法的準確情況和使用Stopwatch測量或其他分析工具來確定,但是這裏有幾點看法:

  • 唯一真正的區別是致電ToList()這是使用.ForEach()所必需的。除此之外,它們是相同的。
  • 因爲我會假設這不是經常運行(您需要多久殺一次每個Excel進程?)在這種情況下,性能差異應該是不重要的。
  • 您可能正在修復症狀而不是問題。我會很好奇爲什麼你有多個需要殺死的excel進程。
+0

你沒有'沒有回答這個問題。它需要詳細闡述「如何」,即你提到的「測量」。 –

+0

@JᴀʏMᴇᴇ「我如何比較這兩個迭代來確定哪個最有效?」 - >「實際的差異只能通過在確切的情況和測量兩種方式來確定,」 –

+1

所以你的答案是運行它的兩種方式和措施?這是C#特有的問題,它至少保證基於C#的答案。這太模糊了。 –

-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; 

它需要5秒爲opeartions的每1000個。

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; 
} 

這需要300毫秒每1000個操作。仍然是一個大數字。

而且開始時間,只是比較數字:

沒有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。開始時間:

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毫秒

那麼,這些數字告訴我,有沒有點優化。凡(),ToList()或的foreach。無論如何,Process的操作會花費數十倍的時間。此外,我瞭解剖析器,並使用它們來測量和優化,但我通過這些示例來獲取確切的數字並顯示出這一點。

+1

爲什麼延遲執行會出現問題? (請注意'Process.GetProcessesByName'返回一個'Process []'。) – Ryan

+0

糟糕的答案。 '這裏耗時的操作是'你怎麼知道什麼是耗時,什麼不是?閱讀我上面關於'ToList'的評論。 –

+0

@JᴀʏMᴇᴇ我編輯了我的答案,並添加了更好的例子來解釋我的觀點。它仍然可怕嗎? –