Медленный вывод результата функции-члена bitset в вектор - PullRequest
2 голосов
/ 23 ноября 2011

Вот часть моего кода C ++, где у меня проблемы:

std::bitset<64>a;
std::bitset<64>b;
std::bitset<64>c;
int bit_count=0;
std::vector<int> vec(SIZE,0);
for (i=1;i<NUM;i++)
{
  // I do here some operations on a and b (a and b will have bits that are set)
  c=a^b;
  bit_count=(int) c.count(); // LINE 1
  vec[i]=bit_count; // LINE2 2
}

Моя проблема заключается в следующем:

  1. , если я комментирую код LINE 1 и LINE 2работает в ок.109ms;
  2. если я только комментирую LINE2, код запускается ок.через 115 мс;
  3. , если я комментирую LINE 1 и bit_count = 0, код выполняется приблизительно 130 мс;
  4. если обе строки (ЛИНИЯ 1 и 2) не закомментированы, код запускается в течение ок.350 мс.

Почему код работает медленно, когда я использую LINE1 и LINE2?Я не нахожу никакого приемлемого объяснения.

Обратите внимание, что я также пробовал vec.push_back (bit_count), и это также медленно.Я также безуспешно пробовал разные операции приведения.

1 Ответ

2 голосов
/ 23 ноября 2011

В случае 2 компилятор может не рассчитать bit_count полностью, так как он никогда не используется (например, он может выполнять XOR, но не считать)

В случае 3 у вас есть только назначение

Только в случае 4 необходимо выполнить bit_count (что довольно дорого).

(отредактируйте, чтобы уточнить: если вы никогда не используете vec, он все равно может отбросить весь цикл. Однако это не обязательно)


дополнительная информация:

Компилятор требуется для сохранения только наблюдаемого поведения , определенного как

  • Доступ к летучим объектам
  • ввод и вывод (включая файлы)
  • вызов "неизвестного" кода (например, внешних библиотек)

Стандартный словоблудие, конечно, более сложный, этот вопрос требует дополнительного обсуждения.

Мне всегда было интересно наблюдать за вашим компилятором. Большинство позволяет включить вывод разборки с умом и часом «ознакомления с сборкой моего процессора» под поясом, такие маленькие упражнения могут быть очень проницательными

...