gpt4 book ai didi

c# - 如何加快实例化大量对象的速度?

转载 作者:太空狗 更新时间:2023-10-29 20:49:02 24 4
gpt4 key购买 nike

下面的代码对于任何重要大小的表都非常慢。 (100、1000 等...)罪魁祸首正在使用 new T() 实例化我的对象。请注意,这不是我最终确定的代码,我只是分解了其中的一部分以便更轻松地进行分析。一旦我将代码重构回形状,实例化和初始化将一起发生。

有什么办法可以加快速度吗?我可能忘记了一些非常简单的事情,或者我可能已经筋疲力尽了。希望是前者。

public static IList<T> ToList<T>(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<T>(entities);
}

编辑更多信息:

任何给定的 ModelType 的构造函数将如下所示:

public ModelType()
{
_modelInfo = new ModelTypeInfo();
}

任何给定的 ModelTypeInfo 的构造函数将简单地设置一些字符串和字符串 [] 值,并且该类的唯一工作是提供值集。

编辑以获取更多信息:

因为这似乎是一个热门话题,下面是我的方法在打破对象构造和初始化之前的真实情况:

public static IList<T> ToList<T>(this DataTable table, ModelInfo modelInfo) where T : Model, new()
{
var tempRepository = new Repository<T>(modelInfo);

var list = new List<T>();
foreach (DataRow row in table.Rows)
list.Add(tempRepository.FromData(table, row));

return list;
}

最佳答案

在幕后,new T()生成对 System.Activator.CreateInstance<T>() 的调用,这是(反射(reflection))慢:

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<!!T>()
L_001d: stelem.any !!T
L_0022: ldloc.1
L_0023: ldc.i4.1
L_0024: add
L_0025: stloc.1

您可能希望考虑传递一个构造委托(delegate)。

关于c# - 如何加快实例化大量对象的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1128073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com