[英]C# array or List(T) for max performance
在這種情況下,任何人都可以建議選擇什么:我有100-500(它們是動態的,意味着在每個請求上其編號始終是不同的)元素,其中包含元素名稱,類型,標識。 目前我正在使用多維數組
public static Object[,] Item_data = new Object[500, 3];
然后我將數據設置為數組:
int found_items = 0;
foreach (Object m in queryCollection)
{
Item_data[found_items, 0] = m[0];
Item_data[found_items, 1] = m[1];
Item_data[found_items, 2] = m[0];
found_plans++;
}
我還有其他8個相同結構的數組,它們填充不同的數據,耗時約0.8-1.5秒,問題是我需要按ID,名稱和類型對這些數組ASC,DESC進行排序,如果我手動使用另一個循環進行排序數據花費時間,所以我注意到List(T)具有排序功能,但是根據以下主題,它的速度要慢得多:
https://jacksondunstan.com/articles/3058
https://softwareengineering.stackexchange.com/questions/221892/should-i-use-a-list-or-an-array
在這種情況下是否值得使用List(T)? 還是有人可以推薦其他東西?
如果需要快速訪問結構,是否嘗試過使用Dictionary<>
? 您可以使用System.Linq
對其進行排序
https://msdn.microsoft.com/en-us/library/xfhwa508%28v=vs.110%29.aspx
List<T>
內部實現T[]
,只是它的靈活性並在Capacity結束時在內部保持擴展。 由於對於所有重要操作,它在內部執行數組操作,只是為動態擴展提供了便利。
根據您的問題:
我有100-500(他們是動態的,在每次請求時都意味着他們的人數總是不同的)
現在理想情況下, new List<T>(100 / 200)
是更好,最理想的選擇,因為它會動態擴展以包含更多數據,不過請注意,沒有多維列表的概念,例如多維數組。 盡管可以使用類似於List<List<T>>
東西來類似於鋸齒數組T[][]
,但是不能使用List<T>
來替換T[,]
。 多維數組適用於具有定義的上下限的矩陣形式的數據。
這與內存優化有關,涉及到各種操作, List<T>
公開數組操作(就地排序), List<T>
和T[]
還公開IEnumerable<T>
的Linq擴展API,由於分配了額外的內存,因此與就地排序一樣有效,並且它們在通用接口而不是特定的數據結構上完成。
現在關於各種用例:
T[]
和List<T>
都是有效的,實際上它們提供了二進制搜索選項,這使搜索排序后的數據的形式為O(LogN)
,比O(N)
,實際上您可以考慮默認情況下對SortedList<TK,TV>
進行排序,但只是它的IDictionary
內部,類似於SortedDictionary<TK,TV>
,對於非常快速的元素搜索,沒有IDictionary<TK,TV>
替代IDictionary<TK,TV>
,它是O(1)
。 以上所有這些只是理論上找到合適的內存和性能組合的最佳方法,就是用各種數據結構測試您的用例,並且您將能夠以最小的折衷找到適合所有用例的合適用例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.