c# 性能优化细节
1、使用itemarray实现对datarow的批量赋值
在对datarow的所有字段赋值时,使用字段名进行逐列赋值效率较低。这时应尽量使用批量字段赋值。可以使用itemarray或rows.add方法:
/ ds是数据集(dataset)对象
datatable dt = ds.tables[0];
datarow row = dt.newrow();
row.itemarray = new object[] { value1, value2, …, valuen };
// ds是数据集(dataset)对象
datatable dt = ds.tables[0];
dt.rows.add(value1, value2, …, valuen);
//应避免做大量连续的单列赋值,如下:
datatable dt = ds.tables[0];
datarow row = dt.newrow();
row["col1"] = value1;
row["col2"] = value2;
…
row["coln"] = valuen;
2、合理使用datatable的并行计算
datatable 内置的并行计算可以充分利用电脑的每个cpu,起到优化效率的作用。
ienumerable<datarow> findrows() //查找所有数量小于0的分录
{
datatable dt = itemdatatable;
……
return dt.select(“quantity<0”); //未使用并行计算
}
ienumerable<datarow> findrows() //查找所有数量小于0的分录
{
datatable dt = itemdatatable;
……
int index = dt.columns.indexof("quantity");
return dt.asenumerable().asparallel().where(dr => (decimal)dr[index] < 0); //使用并行计算:
}
根据实验,当对datatable的行选择时并行计算优于select和循环过滤等方式;当进行行遍历时性能类似。
3、使用importrow实现向同结构datatable合并
使用merge方法可以很方便的实现datatable的合并,但merge的效率却非常差代码;示例如下:
datatable[] srctables = ... ;
foreach(datatable src in srctables )
{
dest.merge( src ) ;
}
importrow也可以实现datatable的合并操作,性能相比merge要高很多。代码示例如下:
datatable[] srctables = ... ;
foreach(datatable src in srctables )
{
foreach(datarow row in src.rows)
{
dest.importrow( row ) ;
}
}
4、待续
以上就是c# dataset性能最佳实践的内容。