假设我想总结一系列布尔值:
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] ;
还有其他方法可以加快速度吗? 这些代码用于循环,即使很小的速度差也很重要。
答案 0 :(得分:4)
始终 MEASURE 。只有测量可以告诉您代码在给定上下文中的行为(给定编译器和选项,给定机器,给定负载等)。如果选择没有被编译器优化,那么没有选择的代码有更好的表现良好的机会。
如果速度真的很重要,我也会尝试std::accumulate
,因为它可能只针对手头的任务进行了优化。
正如Tony D隐含地指出comment to the question,算法和数据结构的选择通常对速度的影响大于微尺度优化。例如,通过更新每个改变值的操作的计数,计数的检查可以是恒定时间。不幸的是,据我所知,std::bitset
(对于编译时已知的大小数组)和boost::dynamic_bitset
(对于动态大小数组)都不能保证这种行为。