第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

列表的大小越大,向其添加新值所需的時間就越長,這是真的嗎?

列表的大小越大,向其添加新值所需的時間就越長,這是真的嗎?

C#
皈依舞 2022-08-20 16:39:23
我正在制作一個程序,可以連續(xù)地從互聯(lián)網(wǎng)實時接收數(shù)據(jù)(字符串類型)。為了獲得更好的性能,它將新數(shù)據(jù)存儲在列表(內(nèi)存)中,并且每天僅將其寫入文件一次。我想知道列表的大小是否越大,向其添加新值所需的時間就越多。例如,在性能方面,向大小為 10 的列表添加新數(shù)據(jù)與對大于 3000000 的列表執(zhí)行相同操作之間是否存在任何差異?我想知道如果我從一開始就設(shè)置列表的默認大小,性能是否會有任何差異,例如.new List<string>(3000000)如果我能得到一些關(guān)于更好地完成這項工作的建議,我將不勝感激。
查看完整描述

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ù)組),然后重用它。但是,在我看來,您可能還需要首先擔心其他事情。


查看完整回答
反對 回復(fù) 2022-08-20
?
達令說

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ù)雜,但是當您向其添加項時,它會使您擺脫性能下降。


查看完整回答
反對 回復(fù) 2022-08-20
  • 2 回答
  • 0 關(guān)注
  • 122 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號