Есть ли разница в производительности между методом сравнения и классом сравнения?

Есть ли разница в производительности между

List<T>.Sort Method (Comparison<T>)

а также

List<T>.Sort Method (IComparer<T>)?

Существуют ли какие-либо структурные (программные) преимущества?

Когда вы используете метод сравнения вместо класса сравнения и наоборот?

РЕДАКТИРОВАТЬ:

List<T>.Sort Method (IComparer<T>) быстрее. Спасибо, Джим Мишель!

Разница в производительности составляет около 1% на моем ПК.

Похоже, класс сравнения быстрее.

2 ответа

Решение

Насколько я помню, List.Sort(Comparer<T>) создает экземпляр IComparer<T> а потом звонит List.Sort(IComparer<T>),

Это выглядит примерно так:

class SortComparer<T>: IComparer<T>
{
    private readonly Comparison<T> _compare;
    public SortComparer(Comparison<T> comp)
    {
        _compare = comp;
    }

    public int Compare(T x, T y)
    {
        return _compare(x, y);
    }
}

public Sort(Comparison<T> comp)
{
    Sort(new SortComparer(comp));
}

Таким образом, они действительно делают то же самое. Когда я рассчитал это (обратно в.NET 3.5), Sort(IComparer<T>) был немного быстрее, потому что не нужно было делать дополнительную разыменовку при каждом вызове. Но разница действительно была недостаточно велика, чтобы о ней беспокоиться. Это определенно случай использования того, что лучше всего работает в вашем коде, а не того, что работает быстрее всего.

Еще немного об этом, включая информацию о дефолте IComparer реализации: Сравнения и IComparer

Разница в том, что первый принимает метод (анонимный или нет), а второй принимает экземпляр объекта сравнения. Иногда проще определить сложные и настраиваемые классы сравнения, чем писать все внутри одной функции.

Я предпочитаю первое для простой сортировки в одном измерении, а второе - для многомерной сортировки, например, в сетках данных.

Используя компаратор, вы можете иметь закрытых членов, которые часто могут помочь с кэшированием. Это полезно в определенных сценариях (опять же, при сложной сортировке большого набора данных, отображаемого в сетке).

Другие вопросы по тегам