【问题标题】:.NET 5 performance issue while iterating a list迭代列表时出现 .NET 5 性能问题
【发布时间】:2021-11-22 15:05:57
【问题描述】:

我有两个具有不同源代码的项目:一个使用 .NET 4.8,另一个使用 .NET 5。它们之间的唯一区别是框架。

相同的代码块在 .NET 5 中的运行速度比在 .NET 4.8 中慢得多;它们之间大约有 20 倍的差异。我阅读了很多资料,尝试了不同的代码,但无法达到更好的性能。

这是我的代码:

public static List<Foo> GetColumnWithDataType(Microsoft.SqlServer.Management.SmoColumnCollection columns)
{
    List<Foo> res = new List<Foo>();
    for (int i = 0; i < columns.Count; i++)
    {
        var result = DoSomeStaff(columns[i]);
        res.Add(result);
    }
    return res;
}

public static Foo DoSomeStaff(Microsoft.SqlServer.Management.Smo.Column column) {

    var result = new Foo();

    if (column.SqlDataType == something)
        result.DataType = "1";
    else if (column.SqlDataType == something2)
        result.DataType = "2";
    .
    .
    .
    else
        result.DataType="0";
    return result;

}
public class Foo
{
    public string DataType { get; set; }
}

我在 .NET 5 中缺少什么?

【问题讨论】:

  • 你不知道列的数据类型吗?为了不映射每一列,这在过程中似乎相当昂贵。
  • @LeandroBardelli 我不知道数据类型。我必须映射它。但这不是重点。 .net 4.8 运行速度非常快
  • 在任何性能回归场景中,第一步都应该是profile,找出实际上更慢的是什么。我会假设它实际上并不是在迭代一个缓慢的列表,而是与数据库有关。
  • 正如 JonasH 所说,对我来说问题不在于列表,而在于您为数据类型所做的工作。反正你是问慢的原因,还是问提高性能?
  • 无论框架如何,SMO 通常都是性能问题的体现,并且是一个关于知道什么是慢什么是快的黑匣子。可以想象 .NET 5 版本依赖于较早的端口,或者依赖于恰好未在 Core 中优化的路径。现在我已经足够专注于它了,因为我对这类任务的首选不是 SMO,如果它也可以通过对系统视图和 Dapper 的一些简单查询来完成,或者像数据库项目这样更高级的东西。

标签: c# .net-5 .net-4.8


【解决方案1】:
public static string DoSomeStaff(Microsoft.SqlServer.Management.Smo.Column column) {

    string result;

    if (column.SqlDataType == something)
        return "1";
    else if (column.SqlDataType == something2)
        return "2";
    .
    .
    .
    else
       return "0";
}

并使用:

public static List<Foo> GetColumnWithDataType(Microsoft.SqlServer.Management.SmoColumnCollection columns)
{
    List<Foo> res = new List<Foo>();
    for (int i = 0; i < columns.Count; i++)
    {

        res.Add(new Foo() { Datatype = DoSomeStaff(columns[i])});
    }
    return res;
}

【讨论】:

  • 有必要对此代码进行一些解释。
  • 我试图做的是简化内存中的动态和对象,无论如何我认为问题在于一般的算法,因为这项工作是在每次迭代中处理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多