Автор блога purplesyringa разобрала горячий цикл своего компрессора:
j = next_j[i][j], одна инструкция mov. Казалось бы, предел. На деле это pointer chasing — каждая итерация ждёт, пока из памяти придёт результат предыдущей, и весь цикл сидит на латентности, хотя вычислений почти нет.Трюк: обернуть присваивание в
if (j != next_j[i][j]). Предсказатель ветвлений считает тело маловероятным, процессор спекулятивно гонит следующие итерации параллельно, а на редком промахе сам откатывает записи. В бенчмарке 320 мкс превратились в 80.Отдельная линия сюжета — война с компилятором: с его точки зрения такой
if бессмысленен, и оптимизатор его выкидывает. Пришлось имитировать независимость условия через volatile; читатели позже нашли, что LLVM достаточно [[unlikely]]. А «правильный» рефакторинг с битовой маской вышел бы медленнее: тест бита на x86 дороже сравнения.Полная статья: https://purplesyringa.moe/blog/quadrupling-code-performance-with-a-useless-if/
@prog_stuff