2 回答

TA貢獻1804條經(jīng)驗 獲得超7個贊
這是將項目添加到列表的實際源代碼,您可以在此處找到列表.cs - 參考源 - Microsoft
public void Add(T item)
{
if (_size == _items.Length) EnsureCapacity(_size + 1);
_items[_size++] = item;
_version++;
}
private void EnsureCapacity(int min)
{
if (_items.Length < min)
{
int newCapacity = _items.Length == 0 ? _defaultCapacity : _items.Length * 2;
// Allow the list to grow to maximum possible capacity (~2G elements) before encountering overflow.
// Note that this check works even when _items.Length overflowed thanks to the (uint) cast
if ((uint)newCapacity > Array.MaxArrayLength) newCapacity = Array.MaxArrayLength;
if (newCapacity < min) newCapacity = min;
Capacity = newCapacity;
}
}
public int Capacity
{
...
set
{
...
if (value != _items.Length)
{
if (value > 0)
{
T[] newItems = new T[value];
if (_size > 0)
{
Array.Copy(_items, 0, newItems, 0, _size);
}
_items = newItems;
}
else
{
_items = _emptyArray;
}
}
}
}
總而言之,它每次都會使容量翻倍,這意味著它實際上只將陣列擴展了有限的次數(shù)。這樣做,它會創(chuàng)建一個新數(shù)組,并用于復(fù)制數(shù)據(jù),這是非??斓?。Array.Copy()
舉個例子,下面是一個包含 100,000,000 個元素的字節(jié)數(shù)組,它在 75 毫秒內(nèi)復(fù)制它。還要記住,在達到.Net的最大數(shù)組限制之前,它最多只會增長約32倍。
var r = new Random();
var bytes = new byte[100000000];
var bytes2 = new byte[100000000];
r.NextBytes(bytes);
var sw = Stopwatch.StartNew();
Array.Copy(bytes,bytes2,bytes.Length);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
如果我能得到一些關(guān)于更好地完成這項工作的建議,我將不勝感激。
好吧,如果這真的是關(guān)鍵任務(wù)的東西,并且你想節(jié)省垃圾回收器和大型對象堆上的分配和內(nèi)存壓力,只需創(chuàng)建一個容量集足夠大的列表(或一個數(shù)組),然后重用它。但是,在我看來,您可能還需要首先擔心其他事情。

TA貢獻1821條經(jīng)驗 獲得超6個贊
正如邁克爾·蘭德爾(Michael Randall)在他精彩的答案(贊成票)中指出的那樣,實際問題的答案是肯定的。但是,即使我們知道列表變大會增加項目的速度,但我們?nèi)匀挥袉栴}。您可以創(chuàng)建列表列表。
為了簡單起見,我將“外部列表”稱為列表列表,將“內(nèi)部列表”稱為外部列表內(nèi)部列表。您可以從創(chuàng)建第一個內(nèi)部列表并讓項目進入它開始,直到它變得相當大,比如說,10 000個元素。然后,創(chuàng)建下一個內(nèi)部列表,新項將放在那里,直到達到限制。等等。這意味著在一天結(jié)束時,您可能有300個列表,每個列表有10 000個元素。它會使您的工作變得復(fù)雜,但是當您向其添加項時,它會使您擺脫性能下降。
- 2 回答
- 0 關(guān)注
- 122 瀏覽
添加回答
舉報