随着时间的推移,添加到列表<t>变得非常慢</t>

时间:2011-03-03 05:11:25

标签: c# winforms

我正在解析一个大约有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();
                });

程序以一致的速度运行,不会阻止用户界面。

3 个答案:

答案 0 :(得分:10)

如果您大致知道集合中的范围(项目数),最好使用数组。

  

原因:如果列表已满,每次向List添加一个元素时,它会分配新的内存块以保存当前空间的两倍并复制其中的所有内容,然后继续附加其他条目,直到它变满,并且更多的分配复制周期。

以下是AFAIK的工作原理,默认情况下以16个元素开头, 当你向列表中添加第17个元素时,它会分配32个元素,然后复制16个,然后继续17到32个并重复此过程,因此速度较慢但提供了不必事先确定长度的灵活性。这可能是你看到阻力的原因。

谢谢@Dyppl var list = new List<int>(1000);这也是一个优雅的选择,因为@Dyppl认为它是两个世界中最好的。

答案 1 :(得分:9)

我测试了将字符串添加到列表中,并使用{{1>} 1000000 (一百万)个项目和一个 100000 LIST_SIZE对其进行了基准测试>(十万)项目。通过这种方式,我们可以比较它的缩放方式。

我每次测试都进行了5次,并计算了运行时间。


LIST_SIZE
var l = new List<string>(); for (var i = 0; i < LIST_SIZE; ++i) { l.Add("i = " + i.ToString()); } 的{​​p> LIST_SIZE需要 1519 ms

1000000的{​​p> LIST_SIZE需要 96 ms


100000
var l = new List<string>(LIST_SIZE); for (var i = 0; i < LIST_SIZE; ++i) { l.Add("i = " + i.ToString()); } 的{​​p> LIST_SIZE需要 1386 ms

1000000的{​​p> LIST_SIZE需要 65 ms


100000
var l = new string[LIST_SIZE]; for (var i = 0; i < LIST_SIZE; ++i) { l[i] = "i = " + i.ToString(); } 的{​​p> LIST_SIZE需要 1510 ms

1000000的{​​p> LIST_SIZE需要 66 ms

所以,我们可以注意到两件事:

  • 在列表变大的时候,添加每个项目确实需要更多时间
  • 差异不应该在1000个项目列表中显而易见

然后我会得出结论,瓶颈在于您调用的其他方法之一。

答案 2 :(得分:3)

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

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

旁注:如果您生成'very'大型列表,则内部增加的存储阵列会随着时间的推移总计达到您真正需要的存储量的两倍。但是如果1000个条目已经减速,我建议用分析器调查它的真正原因。字符串可能会变大吗?