将bitset成员函数count的输出放入向量中的速度很慢

时间:2011-11-23 16:43:22

标签: c++ vector bitset

以下是我遇到问题的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. 如果我对第1行和第2行进行评论,则代码将在约109ms;
  2. 如果我只评论LINE2,则代码运行约。在115毫秒;
  3. 如果我评论LINE 1和bit_count = 0,则代码运行大约130毫秒;
  4. 如果两行(第1行和第2行)都未被注释,则代码将在约。 350毫秒。
  5. 为什么使用LINE1和LINE2时代码会变慢?我找不到任何可接受的解释。

    请注意,我也尝试了vec.push_back(bit_count),它也很慢。我也尝试了不同的演员表演。

1 个答案:

答案 0 :(得分:2)

在情况2中,编译器可能无法完全计算bit_count,因为它从未使用过(例如它可能执行XOR而不是计数)

在案例3中,您只有作业

仅在情况4中,需要执行bit_count(whcih相当昂贵)。

(编辑澄清:如果你从不使用vec,它可能仍然会抛弃整个循环。但它不必,但是)


其他信息:

要求编译器仅保留可观察行为,定义为

  • 访问易失性对象
  • 输入和输出(包括文件)
  • 调用“未知”代码(例如外部库)

标准措辞当然更复杂,this question还有一些额外的讨论。

我总是觉得观察编译器是一项有趣的练习。大多数允许启用反汇编输出,具有一定的思想和一小时的“介绍我的处理器的程序集”不足之处,像这样的小练习可以非常有见地