C++ 布尔数组的求和速度

C++ 布尔数组的求和速度,c++,arrays,performance,sum,boolean,C++,Arrays,Performance,Sum,Boolean,假设我想在一个布尔数组上求和: bool arrray[LARGE_SIZE]; 以下哪种代码的速度更快 int sum=0; for(int i=0;i<LARGE_SIZE) if(array[i]) sum++; int和=0; 对于(int i=0;i始终度量值。只有度量值才能告诉您代码在给定上下文(给定编译器和选项、给定机器、给定负载等)中的行为。但是,如果编译器没有优化选择,没有选择的代码有更好的机会执行良好 如果速度真的很重要,我也会尝试使用std::accula

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

bool arrray[LARGE_SIZE];
以下哪种代码的速度更快

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

对于(int i=0;i始终度量值。只有度量值才能告诉您代码在给定上下文(给定编译器和选项、给定机器、给定负载等)中的行为。但是,如果编译器没有优化选择,没有选择的代码有更好的机会执行良好


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



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

始终度量。只有度量可以告诉您代码在给定上下文(给定编译器和选项、给定机器、给定负载等)中的行为。但是,如果编译器没有优化选择,没有选择的代码有更好的机会执行良好


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



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

最有可能的是
if
版本会因为分支预测器的启动而变慢,但说真的,如果它重要的话,只需测量一下。我测试了它,似乎版本的速度更快,但为什么呢?@abdolahS:当我们不知道你观察到的差异是否是统计的时,问这样的问题是没有意义的SIMY是重要的,可重复的,与你的计算机当时所做的其他处理无关,不管你是否已经启用了优化,汇编语言或机器代码,你的编译器产生的,你正在运行的CPU等等……分别考虑使用和/或一般地跟踪“on”位的数量,因为它们是(re)。是的,OP并没有真正显示出大量的研究成果,但是投票失败似乎有点苛刻。@ TyYd你应该这样做(单独考虑,使用<代码> STD::BITSET 和最有可能的是,
if
版本会因为分支预测器的作用而变得更慢,但说真的,如果它重要的话,就测量一下。我测试了它,似乎版本的速度更快,但为什么呢?@abdolahS:当我们不知道你观察到的差异是否是统计符号时,问这样的问题是没有意义的重要的,可重复的,与你的计算机当时所做的其他处理无关,不管你是否已经启用了优化,汇编语言或机器代码,你的编译器产生的,你正在运行的CPU等等……分别考虑使用和/或一般地跟踪“on”位的数量,因为它们是(re)。是的,OP并没有真正显示出大量的研究成果,但是向下投票似乎有点苛刻。@ TyYd你应该这样做(单独考虑使用<代码> STD::BITSET
和<代码>。
int sum=0;
for(int i=0;i<LARGE_SIZE)
   sum+=array[i] ;