2011-11-23 15 views
2

这里是我的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),它也很慢。我也试过不同的演员操作,但没有成功。

+2

你与优化编译启用? – GWW

+0

也许你的编译器在前三种情况下内联函数。 –

+0

好的第一个问题。清理格式化了一下。 –

回答

2

在案例2中,编译器可以不计算BIT_COUNT完全,因为它从来没有使用过(例如,它可能做的XOR,但不计)

万一3,你刚才分配

只有在第四种情况下,bit_count(相当昂贵)需要执行。

(编辑澄清:如果你从来不使用vec,它仍可能丢掉整个循环它不就得了,虽然)。


附加信息:

的编译器requried只保留观察到的行为,定义为

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

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

我总是发现它是一个有趣的练习来观察你的编译器。大多数允许启用拆卸的产出,inquring头脑和一小时“介绍我处理器的集结号” undere腰带,像小练习可以是非常有见地的