首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2行关键代码的c++优化

2行关键代码的c++优化
EN

Stack Overflow用户
提问于 2016-06-17 12:13:29
回答 1查看 245关注 0票数 4

使用val研和perf/FlameGraphs,我确定了我的应用程序的一部分,它消耗了几乎100%的CPU:

代码语言:javascript
复制
for(size_t i = 0; i < objects.size(); i++) {

  //this part consumes 11% CPU -----> 
  collions_count = database->get_collisions(collisions_block, objects[i].getKey());
  feature1 = objects[i].feature1;
  //<--------

  for(int j = 0; j < collions_count * 2; j += 2) {

    hash = 
      ((collisions_block[j] & config::MASK_1) << config::SHIFT) | 
      ((collisions_block[j+1] - feature1) & config::MASK_2);

    if (++offsets[hash] >= config::THRESHOLD_1) {

      //... this part consumes < 1% of CPU

    }
  }
}

哈希和后续if语句的计算占所有应用程序CPU的近90%。

  • collisions_block只初始化一次,类型为int[100000]
  • config::是一个包含全局配置变量的命名空间。
  • offsets只初始化一次,类型为uint8_t[1<<24]
  • 我正在运行Centos7 Linux3.10.0-327.13.1.el7.x86_64
  • 所有CPU都用于usr,mpstat输出中没有iowait
  • 我正在用g++ (GCC) 4.8.5 20150623 (红帽4.8.5-4)和旗标-std=gnu++11 -Ofast -Wall编译

有什么办法加快内环的速度吗?

EN

回答 1

Stack Overflow用户

发布于 2016-06-24 13:38:45

我发现性能瓶颈是对数组++offsets[hash]的无序访问。它占用了大部分的CPU时间(75+%)。我通过将数组的大小从1<<24减少到1<<21,并试验了适当的MASKS配置,从而实现了2.5倍的速度增长。

我将简要描述我是如何发现这个问题的。

代码语言:javascript
复制
for(size_t i = 0; i < objects.size(); i++) {

  //this part consumes 11% CPU -----> 
  collions_count = database->get_collisions(collisions_block, objects[i].getKey());
  feature1 = objects[i].feature1;
  //<--------

  for(int j = 0; j < collions_count * 2; j += 2) {

    hash = calculate_hash(collisions_block[j], 
      collisions_block[j+1],
      feature1,
      config::MASK_1,
      config::MASK_2
      config::SHIFT);

    if (check_condition(hash, config::THRESHOLD_1)) {

       //... this part consumes < 1% of CPU

    }
  }
}
  1. 将关键的2行拆分成单独的函数,以便更好地分析(请小心地放置__attribute__((noinline))以防止gcc嵌入新函数。如果内联,它们将不会出现在调用堆栈中)
  2. 使用-g -rdynamic gcc标志编译代码
  3. 运行采样性能工具perf record -p <pid> -F 200 -g --call-graph dwarf -- sleep 60
  4. 转换为FlameGraph以获得更好的可读性perf script | ./stackcollapse-perf.pl > out.perf-folded && ./flamegraph.pl out.perf-folded > graph.svg
  5. 从火焰测定仪中找出最昂贵的功能并加以优化
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37881307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档