c优化2行关键代码
| 
 使用valgrind和perf / FlameGraphs,我已经确定了部分应用程序占用了几乎100%的CPU: 
  
  
  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
    }
  }
}hash和follow if语句的计算占用了所有应用程序的近90%的CPU. > collisions_block初始化一次,类型为int [100000] 有没有办法加快内循环? 解决方法
 我发现性能瓶颈是对数组偏移[hash]的无序访问.耗费了大部分CPU时间(75%).通过将阵列的尺寸从1 <24小时减小到1 <21并且尝试适当的MASKS配置,我实现了2.5倍的速度增加. 我将简要介绍一下如何确定问题 
  
  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
    }
  }
}>将关键的2行拆分为单独的函数以便更好地进行分析(小心放置__attribute __((noinline))以防止gcc内联新函数.如果内联,它们不会出现在调用堆栈中) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 
