代码列表:
1.创建字段
2.清空目标表
============================================== 创建字段 ============================================== private static void CreateField() { if (GetWetherCreateField() == false) { dc = new DataColumn(); dc.DataType = System.Type.GetType(ProcessHelper.firstFieldType); dc.ColumnName = ProcessHelper.firstFieldName; destDT.Columns.Add(dc); ProcessHelper.secondFieldName = new string[GetSecondFieldNameCount()]; int dcIndex = -1; for (int i = 0; i < GetSecondFieldNameCount(); i++) { dcIndex++; dc = new DataColumn(); dc.DataType = System.Type.GetType(ProcessHelper.secondFieldType); ProcessHelper.secondFieldName[dcIndex] = "data" + dcIndex.ToString(); dc.ColumnName = ProcessHelper.secondFieldName[dcIndex]; destDT.Columns.Add(dc); } SetWetherCreateField(true); } } ============================================== 清空目标表 ============================================== public static void ClearDestDataTable() { dc = null; dr = null; destDT.Rows.Clear(); destDT.Columns.Clear(); destDT.Clear(); //destDT = new DataTable(); }
问题描述:
程序第一次执行的过程中,执行了代码列表中的1、2,结果正确,时间3秒多。
程序第二次执行的过程中,执行了代码列表中的1、2,结果正确,时间30秒多。
程序第三次执行的过程中,执行了代码列表中的1、2,结果正确,时间30秒多。
.....
程序第十次执行的过程中,执行了代码列表中的1、2,结果正确,时间30秒多。
后来发现代码列表:1中标注为红色的代码,执行特别的慢!
之后,我将代码列表:2中标注为绿色的代码,开启,执行,结果正确,时间30多秒。
而,我将代码列表:2中标注为紫色的代码,开启,执行,结果正确,时间3秒多。
疑问:
为什么我对同一个实例对象,清空其中数据后,再写入数据比重新实例一个对象后,再写数据
要慢这么多呢?
期待你的回复!
email:alphaxj@163.com
你的代码段不全,没办法判断问题出在哪。
建议你监控一下每个方法花费的时间,具体是在清空上费时间还是在创建上费时间
Rich.T
你好!
我单步执行,和直接运行都是在方法 CreateField()方法内的标注红色代码处耗费了时间。
我可以把代码直接发到你的邮箱。
1、你调用Clear()会主动清空内部对象的各个引用,便利垃圾回收器进行回收。而直接destDT = new DataTable();只是new了一个新的对象引用,对于之前存在的对象会被动的在垃圾回收器检查到需回收时依然会做类似clear()工作。(使用完即主动释放可避免浪费内存的使用)
2、destDT.Columns.Add(dc);慢的原因可能是DataTable在加Column时会检查约束,可以代码控制忽略约束检查dt.BeginLoadData();dt.EndLoadData();