2008-08-07 40 views
8

以下哪項性能最好?數據表循環性能比較

我見過兩個方法但用JavaScript實現巨大性能提升,我無法衡量在C#中的任何增益,並想知道如果編譯器已經做方法2,即使寫的方法1.

的方法2背後的理論是,代碼在每次迭代時都不必訪問DataTable.Rows.Count,它可以簡單地訪問int c。

方法1

for (int i = 0; i < DataTable.Rows.Count; i++) { 
    // Do Something 
} 

方法2

for (int i = 0, c = DataTable.Rows.Count; i < c; i++) { 
    // Do Something 
} 

回答

4

不,不能這樣做,因爲沒有辦法表達隨時間恆定一個值。

如果編譯器應該能夠做到這一點,那麼就必須保證返回值的代碼不變,並且在循環期間不會改變。

但是,在這種情況下,您可以自由地將新行作爲循環的一部分添加到數據表中,因此您可以按照您的方式做出保證,這取決於您。

因此,簡而言之,如果最終索引不是變量,編譯器將不會執行該優化。

在變量的情況下,編譯器只需查看循環代碼並查看該特定變量未被更改,就可以這樣做,並在啓動循環之前將該值加載到寄存器中,但任何除非你的循環體是空的,否則性能增益很可能可以忽略不計。

結論:如果您知道或願意接受,結束循環索引在循環的持續時間內是不變的,請將其置於變量中。


編輯:重新看了你的帖子,是的,你可能會看到以下兩個案件以及可以忽略不計的性能提升,因爲抖動優化的代碼。 JITter可能會優化您的結束索引讀取,以便直接訪問包含行數的數據表中的變量,並且內存讀取並不是那麼昂貴。另一方面,如果閱讀該財產是一項非常昂貴的操作,則會看到更明顯的差異。