Listの並び替えの速度

先日の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より遅い。
ということで、理解は間違っていなさそうということで、安心しました。

投稿日:
カテゴリー: C#

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です