布尔数组的求和速度
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
(对于动态大小的数组)都不能保证这种行为。
假设我想对一个布尔数组求和:
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
(对于动态大小的数组)都不能保证这种行为。