Datatable是.net下一个非常好用的数据结构,一般情况下当列的数据量再1000以内的数量级,操作不需要考虑性能。这里为什么提到列,因为Datatable对行的处理非常好,如果列不是很多的时候,插入几万行乃至几十万行数据都是非常快速的。
但是当列过多时,这里就有可能带来非常大的性能问题。现在我们建立了一个10000列的table,并添加了10行的数据,来试验一下不同的插入数据方式会带来怎样的性能影响。
方法1:代码如下,这个一种非常好的方式,总共耗时0.104秒
//METHOD 1
int ColCnt = 10000;
DataTable dt = new DataTable();
//define table columns
for(int i=0; i<ColCnt;i++)
{
dt.Columns.Add("C" + i.ToString(), typeof(float));
}
//add 10 rows data
for (int j = 0; j < 10; j++)
{
DataRow dr = dt.NewRow();
for (int i = 0; i < ColCnt; i++)
{
dr["C" + i.ToString()] = i * 1.1;
}
dt.Rows.Add(dr);
}
方法2:先添加一个Dummy Row,再循环更新此row的每个cell,耗时72秒
//METHOD 2
int ColCnt = 10000;
DataTable dt = new DataTable();
//define table columns
for (int i = 0; i < ColCnt; i++)
{
dt.Columns.Add("C" + i.ToString(), typeof(float));
}
//add 10 rows data
for (int j = 0; j < 10; j++)
{
DataRow dr = dt.NewRow();
//Add dummy row to table
dt.Rows.Add(dr);
//Update row cells that just added
for (int i = 0; i < ColCnt; i++)
{
dt.Rows[dt.Rows.Count-1]["C" + i.ToString()] = i * 1.1;
}
}
大家看出来区别了吧,有人会问为什么要用第二种方法呢,第一种方法就是最常用的呀。是的,我们一般情况下都是用第一种方式比较多。但是实际在添加数据的时候并不都是可以一开始就把数据填充好的,好多时候都是再动态添加行列,动态更新数据的,这就难免会碰到先添加行(可能已有部分cell数据了),后面有需要大量更新一些cell的数据。
这个例子只是给使用Datatable特殊用途(特别是在大量数据时)的码农们提供一些思路:DataRow添加到DataTable之后再更新是一项非常消耗资源的工作,网上解释是DataRow加入Table后再编辑,系统会自动添加很多状态变量以及缓存空间操作,我们更新一个Cell的数据,可能系统做了几十次额外的操作
参考文章
https://stackoverflow.com/questions/28244558/extreme-performance-difference-when-using-datatable-add