簡體   English   中英

C#數組或List(T)可實現最佳性能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM