先日のC#,SortedDictionary,SortedSetに関連して、comparerが遅い問題が気になって実験してみました。
シンプルに、Listに、1万件intを突っ込んで、並び替えをします。
単純なSort(), Sort()してから、Reverse(), comparerを使って直接Reverse順での並び替えをします。
ベンチマークのソースはこちら。
int _loopCount = 10_0000;
static Random _random = new ();
static List<int> _originalList = GetList();
public static List<int> GetList()
{
var list = new List<int>(_loopCount);
for (int i = 0; i < _loopCount; i++)
{
list.Add(_random.Next(_loopCount));
}
return list;
}
public sealed class SortIntReverse : IComparer<int>
{
public int Compare(int x, int y)
{
if (x > y) return -1;
if (x == y) return 0;
return 1;
}
}
[Benchmark]
public List<int> ListSort()
{
var list = _originalList.ToList();
list.Sort();
return list;
}
[Benchmark]
public List<int> ListSortReverse()
{
var list = _originalList.ToList();
list.Sort();
list.Reverse();
return list;
}
[Benchmark]
public List<int> ListSortReverseComparer()
{
var list = _originalList.ToList();
list.Sort(new SortIntReverse());
return list;
}
結果はこちら
| Method | Mean | Error | StdDev |
|------------------------ |---------:|----------:|----------:|
| ListSort | 4.774 ms | 0.0503 ms | 0.0393 ms |
| ListSortReverse | 4.959 ms | 0.0966 ms | 0.1113 ms |
| ListSortReverseComparer | 8.061 ms | 0.0603 ms | 0.0470 ms |
はやり、comparerを使うと遅いですね。
Sort→Reverseより遅い。
ということで、理解は間違っていなさそうということで、安心しました。