2014-07-10 50 views
-1

使用List.AddRange()時,在添加ListArray之間是否有任何性能差異。List.AddRange添加陣列與列表的性能

MyList.AddRange(MyArrayof1000ComplexElements); 

VS

MyList.AddRange(MyListof1000ComplexElements); 

或者是有沒有區別?

+4

你爲什麼不測量它?並使用[Stopwatch](http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) – Habib

+6

[哪個更快?](http:// ericlippert。com/2012/12/17/performance-rant /)_如果你有兩匹馬,並且你想知道哪兩匹比較快,那麼比賽你的馬**。 –

+0

但是在比賽前猜測還是有趣的:-)。 –

回答

1

List<T>T[] - AddRange對執行ICollection<T>的任何事情都使用相同的處理,這兩者都是相同的。

+0

感謝您的澄清。 –

1

Array和List都實現ICollection<T>接口。因此,使用的List.AddRange的實施將是相同的並且將提供相同的性能。

未來,您可以使用類似Stopwatch類的簡單程序自己測試類似的東西,或者下載像JetBrain的dotPeek這樣的工具來親自檢查框架代碼。

-1

這是一個更有趣的問題比一些評論可能暗示。

碰巧,對於這個特定的列表/數組實現,答案是:沒有區別。兩者都依賴於相同的收集界面。

但它不一定是那樣。如果一個列表被實現爲一個雙向鏈表(在很多其他情況下),那麼將一個列表附加到另一個列表中是O(1),而將一個數組附加到列表中是O(n)。

而且我不會以基準測試來解決這個問題。基準測試很耗時,很容易產生易於誤解的結果。在這種情況下,仔細研究實現和底層源代碼(通過.NET反彙編程序很容易獲得)將更快地回答問題。然後基準確認,如果它足夠重要。


請注意,此處適用特定的O(1)優化僅當MyListof1000ComplexElements也是一個列表。如果它是某種枚舉器或鏈表,那麼性能將爲O(n)。


針對那些誰批評了這個答案,請注意,已寫入強調,鑑於其他的答案是基於問題的具體解釋的意圖。他們沒有指出他們對這個問題的解釋有多狹隘,他們的答案有多狹隘。另一位讀者可能很容易忽略這樣一個事實,即如果他們不這樣說,這個答案只適用於這個特定的情況。我的目的只是指出,在許多其他密切相關的情況下,這是一個O(n)操作而不是O(1)。

+1

有一個鏈表實現,它被稱爲'LinkedList'。根據爲其提供的定義,「列表」是一個數組支持列表,應該這樣處理。這不是一個實施細節;它是該類型合同的明確部分。 – Servy

+0

如果這是一個泛型編程問題,我完全同意這個答案。然而,在.NET世界中,'List '和'T []'具有非常具體的實現,它們永遠不會因爲向後兼容性而改變(.NET和其他語言的先例是,如果需要這樣的更改,引入了不同名稱的類)。 – decPL

+1

@decPL它不僅僅是這樣。 「List」是基於數組的列表*在文檔中明確定義爲該數據結構*的實現。這不是每個人都依賴的私人實施細節。它是*公開定義的行爲*。將實現更改爲鏈接列表並不是一個壞主意,但是*它會違反它自己的公共契約。 – Servy