在下面的例子中,有人能解释一下为什么使用自定义比较器的版本比使用其他方法的版本慢得多吗?
我以为他们会很相似,因为他们实际上在做同样的事情?
是因为定制比较器版本必须调用两个方法吗?先进行比较,然后再进行加倍.比较对象?其中,我猜第一个版本只调用了Double.CompareTo?但这真的能解释这么大的差异吗?
public class Program
{
public class ColumnComparer : IComparer<Row>
{
public ColumnComparer(int column)
{
Column = column;
}
public int Column { get; }
public int Compare(Row x, Row y) => x.Values[Column].CompareTo(y.Values[Column]);
}
public class Row
{
public int Index { get; }
public List<double> Values { get; } = new();
public Row(int index)
{
Index = index;
}
}
public class Sort
{
private readonly List<Row> _rows;
public Sort()
{
_rows = new List<Row>();
var r = new Random(0);
for (int i = 0; i < 500000; ++i)
{
var row = new Row(i);
for (int j = 0; j < 32; ++j)
{
row.Values.Add(r.Next(0, 1000));
}
_rows.Add(row);
}
}
[Benchmark]
public void Sort1()
{
_rows.OrderBy(x => x.Values[8]).ToArray();
}
[Benchmark]
public void Sort2()
{
var comparer = new ColumnComparer(8);
var sort2 = _rows.OrderBy(e => e, comparer).ToArray();
}
}
static void Main(string[] args)
{
BenchmarkRunner.Run<Sort>();
}
}
编辑后的内容包括绩效衡量:
方法 | 均值 | 错误 | 标准开发 |
---|---|---|---|
排序1 | 111.6毫秒 | 1.46毫秒 | 1.79毫秒 |
排序2 | 343.5毫秒 | 4.01毫秒 | 7.42毫秒 |
编辑:
新增指标包括Sort3(@dbc)
方法 | 均值 | 错误 | 标准开发 | 已分配 |
---|---|---|---|---|
排序1 | 112.0毫秒 | 0.90毫秒 | 0.85ms | 13.35 MB |
排序2 | 344.4毫秒 | 2.27毫秒 | 2.12毫秒 | 13.35 MB |
排序3 | 138.7毫秒 | 0.64毫秒 | 0.57毫秒 | 17.17 MB |