【发布时间】: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 的一些简单查询来完成,或者像数据库项目这样更高级的东西。