点跟踪配置文件,为什么我的内存提取被标记为慢
dot trace profile, why is my in memory fetch being flagged as slow
我该如何改进?
配置文件提示从列表中获取数据很慢
public List<RowDataDto> Rows { get; set; }
public RowDataDto GetRow(int rowNdx)
{
var row = Rows.SingleOrDefault(x => x.LineNumber == rowNdx);
return row;
}
该列表平均包含大约 1000 个项目,我只是在进行基准测试以查看其性能。
它说最慢的部分是从内存列表中获取。
在调用 GetRow 之前填充行。
LineNumber 是一个 int32
PS - 我刚刚安装了 dotTrace,我对它还很陌生,所以我可能不了解如何正确使用该工具。我有简单的测试。我开始“.Net Process”告诉我的测试 运行 并在某个时候点击拍摄快照。
如果您以前使用过此工具,请指导我。
如果你有内存列表并且你想对其执行多次查找 - 最好使用字典而不是列表。为了便于使用,如果需要,您可以公开该字典值的只读集合(将字典公开为 public 成员通常不好):
private Dictionary<int, RowDataDto> _rows;
public IReadOnlyCollection<RowDataDto> Rows {get {return _rows.Values;}}
public RowDataDto GetRow(int rowNdx)
{
var row = _rows.ContainsKey(rowNdx) ? _rows[rowNdx] : null;
return row;
}
另请注意,使用 SingleOrDefault
很少有用。如果您的列表不应包含重复项 - 只需使用 FirstOrDefault
。 SingleOrDefault
必须遍历整个列表以确保没有重复项,在这种情况下意味着它将始终遍历整个列表。
我该如何改进?
配置文件提示从列表中获取数据很慢
public List<RowDataDto> Rows { get; set; }
public RowDataDto GetRow(int rowNdx)
{
var row = Rows.SingleOrDefault(x => x.LineNumber == rowNdx);
return row;
}
该列表平均包含大约 1000 个项目,我只是在进行基准测试以查看其性能。
它说最慢的部分是从内存列表中获取。
在调用 GetRow 之前填充行。
LineNumber 是一个 int32
PS - 我刚刚安装了 dotTrace,我对它还很陌生,所以我可能不了解如何正确使用该工具。我有简单的测试。我开始“.Net Process”告诉我的测试 运行 并在某个时候点击拍摄快照。
如果您以前使用过此工具,请指导我。
如果你有内存列表并且你想对其执行多次查找 - 最好使用字典而不是列表。为了便于使用,如果需要,您可以公开该字典值的只读集合(将字典公开为 public 成员通常不好):
private Dictionary<int, RowDataDto> _rows;
public IReadOnlyCollection<RowDataDto> Rows {get {return _rows.Values;}}
public RowDataDto GetRow(int rowNdx)
{
var row = _rows.ContainsKey(rowNdx) ? _rows[rowNdx] : null;
return row;
}
另请注意,使用 SingleOrDefault
很少有用。如果您的列表不应包含重复项 - 只需使用 FirstOrDefault
。 SingleOrDefault
必须遍历整个列表以确保没有重复项,在这种情况下意味着它将始终遍历整个列表。