- PVSM.RU - https://www.pvsm.ru -
В продолжение темы [1] хочу поделиться своим кодом, который обгоняет std::sort() из актуальных версий GNU C++ Library [2] и (примерно, нет точных данных) повторяет результат "Сортировки Александреску" с CppCon 2019 [3].
В коде на С (не C++) требовалось разумными усилиями получить сортировку не хуже std::sort(), чтобы избавиться от накладных расходов использования библиотечной qsort(). В том числе, поэтому использовать макросы вместо шаблонов.
В свою очередь, если сортировать "мышей", а не "слонов", то затраты на qsort() достаточно велики: лишняя адресная арифметика и косвенный вызов функции-компаратора.
По имеющейся информации эта комбинация [4] алгоритмов и особенностей реализации быстрее многих других вариантов в практическом смысле:
C++ подсчитывающего сравнения и присваивания).Весьма вероятно, что этот вариант чуть быстрее и/или несущественно медленнее подавляющего большинства сортировок, но выяснить это — буквально титанический труд, который я не могу себе позволить.
Любопытно если кто-то сравнит этот вариант с текущими вариантами в Tarantool, PostgreSQL, SQLite и MySQL. Надеюсь kaamos [6] не сможет пройти мимо со своим SysBench [7].
В первом-же комментарии от RPG18 [8] появилась ссылка на недавнее выступление Andrei Alexandrescu “Speed Is Found In The Minds of People" [9], где он подводит к достаточно похожей идее, но ближе к финалу уходит в heap_sort.
Выступление мне показалось несколько затянутым (вот если-бы olegbunin [10] хоть раз дал 90 минут...), а цифр недостаточно. В частности, хочется видеть поведение сортировки с ростом N, поскольку увеличение порога завершения QuickSort приводит к ускорению на больших размерах и замедлению на маленьких и т.п.
Тем не менее, судя по цифрам, которые приводит Александреску, описанный вариант внезапно даёт аналогичное ускорение. Однако, пока я не нашел показанного Александреску кода в готовом виде, чтобы "взять и сравнить", а кодировать по видео пока некогда (пишите если найдете или сделайте).
Теоретико-идейная сторона "алгоритма" достаточна проста:
Log2(N).Стоит отметить, что в зависимости от архитектуры процессора и условий применения можно увеличить выигрыш на длинных последовательностях до 10-15% выбрав SORT_THRESHOLD в пределах 128-256. Однако, при этом замедляется обработка последовательностей с обратным порядком и близким к нему.
Тем не менее, это хороший бонус если вы понимаете, что в ваших данных обратный порядок маловероятен, либо если вы можете дешево обнаруживать такие случаи и выполнять ветку с маленьким SORT_THRESHOLD.
P.S.
Описанный вариант сортировки был "допеределан" для моего проекта libmdbx [11] (быстрая встраиваемая key-value БД с ACID), в котором на днях были актуализированы README и описание API (фактически написано заново). Поэтому буду благодарен как за исправление опечаток, так и за советы и предложения. Самому, как правило, не видна нехватка какой-то информации.
Автор: Леонид Юрьев
Источник [12]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/331664
Ссылки в тексте:
[1] темы: https://habr.com/ru/post/467473/
[2] GNU C++ Library: https://gcc.gnu.org/onlinedocs/libstdc++/
[3] CppCon 2019: https://cppcon.org/
[4] эта комбинация: https://github.com/leo-yuriev/libmdbx/commit/aceab9be443349693b3507f01cfd7e75423646fa#diff-bfae35a58667fce4a4b2e7a26cea56bcR833-R946
[5] SORT_THRESHOLD: https://github.com/leo-yuriev/libmdbx/commit/aceab9be443349693b3507f01cfd7e75423646fa#diff-bfae35a58667fce4a4b2e7a26cea56bcR842
[6] kaamos: https://habr.com/ru/users/kaamos/
[7] SysBench: https://github.com/akopytov/sysbench
[8] RPG18: https://habr.com/ru/users/rpg18/
[9] “Speed Is Found In The Minds of People": https://www.youtube.com/watch?v=FJJTYQYB1JQ
[10] olegbunin: https://habr.com/ru/users/olegbunin/
[11] libmdbx: https://github.com/leo-yuriev/libmdbx
[12] Источник: https://habr.com/ru/post/469471/?utm_source=habrahabr&utm_medium=rss&utm_campaign=469471
Нажмите здесь для печати.