加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何加速实例化大量对象?

发布时间:2020-12-15 18:23:23 所属栏目:百科 来源:网络整理
导读:对于任何显着大小的表,下面的代码都非常慢. (100,1000等…)罪魁祸首是使用新的T()实例化我的对象.请注意,这不是我最终确定的代码,我只是将其中的部分内容删除,以便更容易地进行分析.一旦我将代码重构成形状,实例化和初始化将一起发生. 有什么方法可以加快速
对于任何显着大小的表,下面的代码都非常慢. (100,1000等…)罪魁祸首是使用新的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;
}

解决方法

在幕后,新的T()生成对System.Activator.CreateInstance< T>()的调用,这是(反射)慢的:
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

您可能希望考虑传递建筑代表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读