Знатоки могут припомнить статью "ARRAY LAYOUTS FOR COMPARISON-BASED SEARCHING" от марта 2017, где примерно аналогичный поиск, но:
1. Алгоритма тут никакого нового нет, а подобный branchless поиск я написал лет за 20 до этой статьи ;)
2. У них там небольшой баг.
3. В реальности код из статьи портиться компилятором (этот вариант тоже есть в бенчмарке).
Речь о поиске при дешевом сравнении. Например, в массиве чиселок, но не строк. Мне такой поиск нужен в предельно быстром виде в libmdbx, для поиска в непустых списках страниц (dirty, spilled, free, etc).
Исходно прицел был в ускорение для E2K за счет ликвидации переходов, ибо VLIW и т.д.
Однако, самый неожиданный результат на более-менее свежих "штеудах" = ускорение поиска в 4 раза и почти в 2.5 раза на Apple M1 Max (aarch64).
С точки зрения алгоритма/математики (конечно) ничего нового, просто убрать лишнее. В практической плоскости сложнее убедить компилятор ничего не испортить. Например, clang жутко портит подобный код с 2017 года (с версии 5). Эту багу оптимизатора обсуждали уже несколько раз, но пока без изменений. Поэтому я из спортивного интереса озадачился обходным путем. В результате получилось хорошо.
Знатоки могут припомнить статью "ARRAY LAYOUTS FOR COMPARISON-BASED SEARCHING" от марта 2017, где примерно аналогичный поиск, но:
1. Алгоритма тут никакого нового нет, а подобный branchless поиск я написал лет за 20 до этой статьи ;)
2. У них там небольшой баг.
3. В реальности код из статьи портиться компилятором (этот вариант тоже есть в бенчмарке).