对于任何显着大小的表,下面的代码都非常慢.(100,1000等...)罪魁祸首是实例化我的对象new T()
.请注意,这不是我最终确定的代码,我只是将其中的部分内容删除,以便更容易地进行分析.一旦我将代码重构成形状,实例化和初始化将一起发生.
有什么方法可以加快速度吗?我可能会忘记一些非常简单的事情,或者我可能会被剔除.希望是前者.
public static IListToList (this DataTable table) where T : Model, new() { T[] entities = new T[table.Rows.Count]; // THIS LOOP IS VERY VERY SLOW for (int i = 0; i < table.Rows.Count; i++) entities[i] = new T(); // THIS LOOP IS FAST for (int i = 0; i < table.Rows.Count; i++) entities[i].Init(table, table.Rows[i]); return new List (entities); }
编辑更多信息:
任何给定的构造函数ModelType
将如下所示:
public ModelType() { _modelInfo = new ModelTypeInfo(); }
任何给定的构造函数ModelTypeInfo
将简单地设置一些字符串和字符串[]值,并且该类的唯一作用是提供值集.
编辑更多信息:
因为它似乎是一个热门话题,所以在打破对象构造和初始化之前,这是我的方法对于实数的看法:
public static IListToList (this DataTable table, ModelInfo modelInfo) where T : Model, new() { var tempRepository = new Repository (modelInfo); var list = new List (); foreach (DataRow row in table.Rows) list.Add(tempRepository.FromData(table, row)); return list; }
Jeffrey Hant.. 13
在封面下,new T()
生成一个System.Activator.CreateInstance
(反射)缓慢的调用:
L_0012: ldc.i4.0 L_0013: stloc.1 L_0014: br.s L_0026 L_0016: ldloc.0 L_0017: ldloc.1 L_0018: call !!0 [mscorlib]System.Activator::CreateInstance() L_001d: stelem.any !!T L_0022: ldloc.1 L_0023: ldc.i4.1 L_0024: add L_0025: stloc.1
您可能希望考虑传递建筑代表.
在封面下,new T()
生成一个System.Activator.CreateInstance
(反射)缓慢的调用:
L_0012: ldc.i4.0 L_0013: stloc.1 L_0014: br.s L_0026 L_0016: ldloc.0 L_0017: ldloc.1 L_0018: call !!0 [mscorlib]System.Activator::CreateInstance() L_001d: stelem.any !!T L_0022: ldloc.1 L_0023: ldc.i4.1 L_0024: add L_0025: stloc.1
您可能希望考虑传递建筑代表.