布尔数组的求和速度

Speed of summation over a boolean array

假设我想对一个布尔数组求和:

bool arrray[LARGE_SIZE];

以下哪一个代码的速度更快?

int sum=0;
for(int i=0;i<LARGE_SIZE)
   if(array[i]) sum++;

int sum=0;
for(int i=0;i<LARGE_SIZE)
   sum+=array[i] ;

有没有其他加速的方法? 这些代码在循环中使用,即使是很小的速度差异也很重要。

始终测量。只有测量可以告诉您代码在给定上下文(给定的编译器和选项、给定的机器、给定的负载等)中的行为方式。尽管如此,如果编译器没有优化选择,没有选择的代码更有可能表现良好。


如果速度真的很重要,我也会尝试 std::accumulate,因为它可能只是针对手头的任务进行了优化。


Tony D implicitly points out in a 一样,算法和数据结构的选择通常比微观优化对速度的影响更大。例如,通过为每个更改值的操作更新计数,计数的检查可以是恒定时间。不幸的是,据我所知,std::bitset(对于编译时已知大小的数组)和 boost::dynamic_bitset(对于动态大小的数组)都不能保证这种行为。