← На главную

Кристоф Казер переписал Quicksort без ветвлений, Clang ускорил 6 раз

11.07.2026 10:50 · hackernews

Автор Кристоф Казер оптимизировал Quicksort и наткнулся на любопытный эффект: современные компиляторы (особенно Clang) генерируют быстрый код без ветвлений, если использовать правильный стиль.

Он написал сортировку blqsort на C — с сортирующими сетями и ручной развёрткой циклов (UNROLL = 16). На macOS/M1 с Clang -O3 версия сортировала 50 миллионов double за 4.39 секунды. std::sort из C++ делал то же самое за 1.33 секунды. Потом Казер сделал «косметическое» изменение — заменил явные if … else с инкрементом указателей на компактную форму *lwr++ = x / *rwr-- = x. И всё переписал.

Результат: время упало до 0.70 секунды. Это в 6 раз быстрее первой версии и почти вдвое быстрее std::sort.

Что произошло на самом деле? Clang заменил настоящие ветвления (инструкции b.pl / b на ARM) на условные перемещения — csel на ARM или cmov на x86. Вместо того чтобы прыгать по разным веткам кода (что сбивает предсказатель переходов), процессор выбирает нужный адрес для записи результата сравнения и плюсует шаг без единой проверки условия. Код стал плоским, без ответвлений.

GCC таких фокусов не делает — он генерирует медленную версию с ветвлениями на обоих стилях исходника. Так что «одна и та же логика» — это не одно и то же для компилятора. Clang замечает компактную запись как паттерн для branchless code. А автор теперь советует: если if замедляет код — от него стоит избавляться.

Читать оригинал →