Соответствующая информация о моей системе:
Core2Duo T6500
gcc (GCC) 4.4.1 20090725 (Red Hat 4.4.1-2)
Используя реализацию базового набора, где каждый сохраненный набор является просто лексикографическим порядком сохраненного набора, вы можете использовать стандартные битовые операции для операций Set, таких как объединение, пересечение, elementQ и т. Д.
Мой вопрос касается определения размера набора. Реализации типа Cliquer используют
static int set_bit_count[256]
для хранения количества битов в любой данной возможной 8-битной строке, а затем алгоритм будет проходить через 8 битов за раз, чтобы определить размер набора.
У меня две проблемы с этим:
- Если регистры более чем в 8 раз быстрее, чем кэш или ОЗУ, это приведет к потере скорости.
- На 64-битной машине не являются
int
операции медленнее, чем, скажем, unsigned long long int
, которые я предполагаю, являются стандартными целыми числами на 64-битных процессорах.
Но я хотел бы представить, просто используя
while(x)
x&=x-1;
++count;
может быть быстрее, поскольку все может храниться в регистрах. Но с другой стороны, может ли что-то отличаться от очевидного в 8 раз больше операций?
Кроме того, существует так много различных комбинаций int, uint, unsigned long, unsigned long long
, что я понятия не имею, с чего начать тестирование.
Знаете ли вы какие-либо очерки на эту тему?
Знаете ли вы какие-либо другие вопросы по этой теме?
Есть ли у вас какие-либо идеи по этому поводу?
Есть ли у вас какие-либо предложения по профилированию? Я никогда не использовал gprof. И когда я использую time.h, я не могу получить тоньше, чем секунда детализации.
Я был бы очень признателен, если бы вы сделали.