直观比较 popcount 的效率差异

问题

\(\sum\limits_{i=1}^{3\times 10^8} popcount(i)\)
仅考虑在暴力做法下的效率。

枚举位

__builtin_popcount

#include<bits/stdc++.h>
using namespace std;
int n;
long long ans;
int main(){
  n=3e8;
  for(int i=1;i<=n;i++){
    ans+=__builtin_popcount(i);
  } 
  cout<<ans<<'\n';
}

-O2

#pragma GCC optimize(2) 
#include<bits/stdc++.h>
using namespace std;
int n;
long long ans;
int main(){
  n=3e8;
  for(int i=1;i<=n;i++){
    ans+=__builtin_popcount(i);
  } 
  cout<<ans<<'\n';
}

-O2,-popcnt

#pragma GCC optimize(2) 
#pragma GCC target("popcnt")
#include<bits/stdc++.h>
using namespace std;
int n;
long long ans;
int main(){
  n=3e8;
  for(int i=1;i<=n;i++){
    ans+=__builtin_popcount(i);
  } 
  cout<<ans<<'\n';
}

效率

方式 时间 1 时间 2 时间 3 平均值
枚举位
优化
__builtin_popcount 0.808s 0.876s 0.815s 0.833s
-O2 0.796s 0.702s 0.718s 0.739s
-O2, -popcnt 0.173s 0.175s 0.172s 0.173s
posted @ 2020-09-13 19:50  wlzhouzhuan  阅读(565)  评论(0编辑  收藏  举报