2011-05-06 56 views
0

我目前正在使用將執行以下操作的應用程序。.net與容量相關的通用列表優化

// Initialize a list: 
myList = new List<aPoint>; 
while(WeHaveMoreData) 
    myList->Add(ReturnNext1000Points()); 

我無法從頭開始知道列表的總大小。從我讀到的,List<>是處理這麼多數據傳入的最佳方式(可能超過500k記錄)。

我想知道如果我應該處理列表的capicity(給它初始值,或增加蓋子,如果需要的話)?

我該如何優化這樣的程序?

+0

要添加到問題,我正在.net 2.0約束下工作。 – greggorob64 2011-05-06 18:50:49

回答

3

如果你有,你可以設置列表的容量記錄總數的近似值,否則讓它成長。它非常優化,只要確保不會耗盡內存。另一種方法是使用一個懶惰的迭代器,不會在內存中加載整個列表:

public IEnumerable<aPoint> GetPoints() 
{ 
    while(WeHaveMoreData) 
    { 
     yield return new aPoint(); 
    } 
} 

一旦你開始迭代的記錄將開始牽強,一個接一個和立即釋放這只是

foreach (var point in GetPoints()) 
{ 
    /// TODO: do something with the point 
} 
+0

這將是一個理想的解決方案,不幸的是,我在VC++/2.0,沒有一代產量操作編程,而「GetNext1000」是一個非託管的C函數調用從SHMEM – greggorob64 2011-05-06 18:39:41

+1

數據拉@ greggorob64,爲什麼是你的問題標記爲C#然後?由於這個標籤,我認爲它可能是您可以接受的語言。 – 2011-05-06 18:43:56

+0

你有一點。如果我將它標記爲C++,很少會看到問題。我可以提出的一個有效約束是使用C#2.0。在那之前,語言不會分歧(那麼多)。 – greggorob64 2011-05-06 18:50:28

1

我也認爲你不能優化它很多..我想你可以在一些特定情況下做得稍微好點,所以我有一個問題 - 之後你對數據做了什麼?另外 - 你想優化內存或速度?

一個典型的列表實現會使容量每次增長2倍,所以也許你可以通過擁有一個List<aPoint[]>來節省一些空間,因爲它會有更少的元素,所以你不太可能擁有幾個100k的剩餘容量。但是,如果你正要耗盡內存,只會重要 - 這可能是因爲更多的內存都花在數據本身在任何情況下..

+0

數據經過分析並添加到數據可視化中。分析直方圖 – greggorob64 2011-05-06 18:51:42

+0

那麼,您是否實際上需要一整套分析用於分析? – xs0 2011-05-06 19:17:43

2

第一條規則:過早的優化是所有罪惡的根源。如果性能不是問題,請保持原樣。過分地,你應該嘗試設置列表的初始大小爲約AverageExpectedSize/0.7

1

一般情況下,我會說,如果你不知道的元素中的發言權+/- 20%的數量,那麼你或許應該只是一味地添加到列表,而不是猜測的能力。

當涉及到容量增加時,列表與數組不同。請記住,一旦你的容量超過容量,名單將容量加倍。因此,例如,如果列表的當前容量爲128個元素,並且添加了一個使其成爲129個元素的元素,則該列表將將其容量調整爲256個元素。然後對於接下來的128個添加,您根本不調整列表的大小。一旦你達到257,它會翻倍到512,並且這個過程會重演。

因此,您將O(log(n))調整爲您的列表。