Есть ли разница в производительности между методом сравнения и классом сравнения?
Есть ли разница в производительности между
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
Разница в том, что первый принимает метод (анонимный или нет), а второй принимает экземпляр объекта сравнения. Иногда проще определить сложные и настраиваемые классы сравнения, чем писать все внутри одной функции.
Я предпочитаю первое для простой сортировки в одном измерении, а второе - для многомерной сортировки, например, в сетках данных.
Используя компаратор, вы можете иметь закрытых членов, которые часто могут помочь с кэшированием. Это полезно в определенных сценариях (опять же, при сложной сортировке большого набора данных, отображаемого в сетке).