2011-08-03 73 views
2

我正在使用C#編寫應用程序。我運行了一些基準來嘗試加快我的應用程序並解決了一個問題。我有一個環路,它需要在分開的時間間隔運行多次:首次索引數組太慢了

Process[] processes = Process.GetProcesses(); 
foreach (Process process in processes) 
    if (process.MainWindowTitle == "Title") 
    { 
     // Do Stuff 
    } 

我意識到的問題是,一旦創建陣列,訪問該陣列的特定元素大於隨後的訪問需要顯著更長。

if (processes[0].MainWindowTitle == "Title") { } // ~0.5 ms 
if (processes[0].MainWindowTitle == "Title") { } // ~0.0 ms 
if (processes[0].MainWindowTitle == "Title") { } // ~0.0 ms 
if (processes[0].MainWindowTitle == "Title") { } // ~0.0 ms 

這是一個相當重要的問題。應該少於0.1ms的東西需要50ms。爲什麼會發生這種情況,我能做些什麼來加快速度?

回答

9

它沒有訪問緩慢的數組 - 它獲得了MainWindowTitle屬性,我相信這是屬於懶散填充的。當你第一次問它的時候,它正在做所有的操作系​​統gubbins來獲取這個值。

要測試此,請嘗試:

if (processes[0] != null) 

,我想你會發現會從一開始就非常快權利。

+0

+1聽起來很可能 – Jonno

+0

是的,你是對的。我正在尋找我的基準測試的錯誤位置。 MainWindowTitle會檢查它是否先緩存標題,如果它沒有做一些Native magic來獲得它,我猜它是放慢速度的地方。謝謝。 – Dave