Я профилирую некоторый код, который использует dynamic_bitset<>
и я обнаружил, что мое узкое место возникает в count()
функция, которую нужно вызывать миллионы раз в цикле for. Короче говоря, цикл for принимает пары наборов битов, вычисляет пересечение множества с использованием &
, а затем сохраняет вес Хэмминга, используя count()
,
Сравнивать с обычным <bitset>
в STL я реализовал набор битов в виде массива long и использовал __builtin_popcountl()
(используется в <bitset>
) и обнаружил, что это намного медленнее — примерно на 50% медленнее. Кто-нибудь смотрел на буст do_count()
функция, найденная в <boost/detail/dynamic_bitset.hpp>
потому что он использует таблицу поиска, которую я совсем не понимаю.
Чтобы быть более ясным, мой вопрос, почему Boost’s do_count()
гораздо эффективнее, чем __builtin_popcount()
?
Задача ещё не решена.
Других решений пока нет …