2011-03-16 27 views
0

這可能是一個愚蠢的問題,但...是兩個循環比一個循環在C#中重組兩個代碼更昂貴嗎?

重構我的代碼,我想出了一個問題,我找不到任何答案:

假設我有一個包含對象MyDumyObject String類型的屬性FooBar

假設我也有MyDumyObject的集合稱爲MyDumyCollection

foreach(MyDumyObject obj in MyDumyCollection) 
{ 
    obj.Foo = "fooooooooo"; 
    obj.Bar = "baaaaaaaar"; 
} 

相當於

foreach(MyDumyObject obj in MyDumyCollection) 
{ 
    obj.Foo = "fooooooooo"; 
} 

foreach(MyDumyObject obj in MyDumyCollection) 
{ 
    obj.Bar = "baaaaaaaar"; 
} 

我在猜測:沒有 但我被C#和C#編譯器以前的工作方式欺騙過,所以我現在小心謹慎對待我的假設,並且我很樂意進行確認或駁斥。

補充問題:

foreach(MyDumyObject obj in MyDumyCollection) 
{ 
    obj.Foo = "fooooooooo"; 

    // .... 

    obj.Foo = "foooooooooooooooooooooooo"; 
} 

相當於

foreach(MyDumyObject obj in MyDumyCollection) 
{ 
    obj.Foo = "fooooooooo"; 
} 

// .... 

foreach(MyDumyObject obj in MyDumyCollection) 
{ 
    obj.Foo = "foooooooooooooooooooooooo"; 
} 

回答

10

兩個循環不止一個 循環

假設是循環語句內的代碼更昂貴得多比循環開銷它本身應該更加昂貴並不重要 - 但在你的情況下,開銷似乎更重要,所以是的兩個循環更昂貴。對於每一個循環,都必須生成一個枚舉器,並且您必須先爲列表中的每個項目前進到枚舉中的下一個項目(即使列表是一個簡單的索引訪問[]) - 帶有兩個循環開銷兩次

另外請記住,有些枚舉中無法迭代兩次,因爲迭代時會消耗數據,即從網絡接收數據,但這些情況遠在兩者之間 - 對於內存集合(如List<T> )這通常不適用。

通常爲了可讀性和微優化 - 我真的不認爲循環開銷很重要。

+3

這真的取決於。根據我的經驗,大多數集合都很小,但如果有數百萬個項目,那麼我寧願重複一次以上。除此之外,我認爲單循環更「*」可讀,而不是更少。 – LukeH 2011-03-16 15:21:20

+0

@LukeH:我完全同意 – BrokenGlass 2011-03-16 15:23:16

+0

這完全回答我的問題,謝謝。我沒有太多的東西(最多大約1000個),所以沒有太大的開銷,並且循環中的代碼相當昂貴,所以我會說在我的情況下,一個或兩個循環沒有什麼區別。我會解決可讀性:) – David 2011-03-16 15:32:07

1

你也可以問一個循環是否有任何開銷。它可能沒有太多的開銷,但如果它有任何的話,那麼兩個循環會有更多。

1

在你的子問題上,它真的歸結爲省略號中發生的情況。如果您在設置它的點之間引用obj.Foo的值(或YourDummyCollection中的任何obj的Foo值),那麼雙循環方案可能會產生不同的結果。比方說,例如,你在循環中有一個呼叫,再次循環集合,增加所有Foos的長度。上一次循環時,除了一個循環外,它將包含所有「foooooooooooooooooooooooo」 - 但如果將第二個賦值分隔到自己的循環中,則全部爲「fooooooooo」。很不一樣。