簡體   English   中英

添加到列表 <t> 隨着時間的推移會變得很慢

[英]Adding to List<t> becomes very slow over time

我正在解析一個大約有1000行的html表。 我在每行的一個<td>中添加~10個字符串到list<string>對象。 前200個左右的循環非常快,但隨着時間的推移變得越來越慢。

這是我正在使用的代碼:

List<string> myList = new List<string>();
        int maxRows = numRows;


        for (int i = 1; i < maxRows; i++)
        { 
            TableRow newTable = myTable.TableRows[i];
            string coll = string.Format("{0},{1},{2},{3},{4}",newTable.TableCells[0].Text,newTable.TableCells[1].Text,newTable.TableCells[2].Text,newTable.TableCells[3].Text,newTable.TableCells[4].Text);
            myList.Add(coll);
            label1.Text = i.ToString();
        }

我應該使用數組嗎?

編輯:我將上面的代碼放在一個新的方法上,該方法在一個新的Thread上運行,然后使用以下代碼更新我的標簽控件:

label1.Invoke((MethodInvoker)delegate
                {
                    label1.Text = i.ToString();
                });

程序以一致的速度運行,不會阻止UI。

如果您大致知道集合中的范圍(項目數),最好使用數組。

原因:如果列表已滿,每次向List添加一個元素時,它會分配新的內存塊以保存當前空間的兩倍並復制其中的所有內容,然后繼續附加其他條目,直到它變滿,再添加一個分配副本周期。

以下是AFAIK的工作原理,默認情況下以16個元素開頭,當你向列表中添加第17個元素時,它會分配32個元素,然后復制16個,然后繼續17到32個並重復這個過程,因此速度較慢但提供了靈活性不必事先確定長度。 這可能是你看到阻力的原因。

謝謝@Dyppl var list = new List<int>(1000); 這也是一個優雅的選擇,因為@Dyppl認為它是兩個世界中最好的。

我測試了將字符串添加到列表中,並使用1000000 (100萬)項的LIST_SIZE100000 (十萬)項的LIST_SIZE進行基准測試。 這樣我們就可以比較它如何擴展。

我每次測試5次並平均運行時間。


var l = new List<string>();
for (var i = 0; i < LIST_SIZE; ++i) {
    l.Add("i = " + i.ToString());
}

LIST_SIZE1000000需要1519 ms

LIST_SIZE100000需要96毫秒


var l = new List<string>(LIST_SIZE);
for (var i = 0; i < LIST_SIZE; ++i) {
    l.Add("i = " + i.ToString());
}

LIST_SIZE1000000需要1386 ms

LIST_SIZE100000需要65毫秒


var l = new string[LIST_SIZE];
for (var i = 0; i < LIST_SIZE; ++i) {
    l[i] = "i = " + i.ToString();
}

LIST_SIZE1000000需要1510 ms

LIST_SIZE100000需要66毫秒

所以,我們可以注意到兩件事:

  • 列表越大,添加每個項目確實需要更多時間
  • 在1000個項目列表中,差異不應該是明顯的

那么我會得出結論,瓶頸是你調用的其他方法之一。

使用您希望使用的容量初始化List:

List<string> myList = new List<string>(maxRows);

旁注:如果生成“非常”的大型列表,則內部增加的存儲陣列會隨着時間的推移總計達到您真正需要的存儲量的兩倍。 但是如果1000個條目已經減速,我建議用分析器調查它的真正原因。 字符串可能變大嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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