C++ c++;优化2行关键代码

C++ c++;优化2行关键代码,c++,optimization,C++,Optimization,通过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 = ob

通过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

    }
  }
}
for(size_t i=0;i
碰撞计数=数据库->获取碰撞(碰撞块,对象[i].getKey());
feature1=对象[i]。feature1;

// 我发现性能瓶颈是对数组
++偏移量[hash]
的无序访问。它占用了大部分CPU时间(75%)。我通过将数组的大小从
1减少到
1,从而实现了2.5倍的速度提高。另外,
偏移量
是一个巨大的数组,可以使用
散列来访问,我认为它根本没有顺序值。这意味着缓存可能不适用于该数组,这会使循环速度变慢。我不确定是否有解决方法r尽管(可能使用稀疏数据结构,例如“默认映射”),但由于散列的特性,@jdehesa,我认为不可能找到解决方法……我看到了两件可以尝试的事情,但它们不太可能有多大作用。1)在循环之前计算“const int n_collisions=collisions_count*2;”,将循环更改为“for”(int j=0;jconfig::THRESHOLD_1
不是
const
,则在循环之前复制一个
const
副本。这里可能是编译器能够对事情进行更多优化。其他两个
config
s也一样。我怀疑这其中任何一个都会有多大价值,但值得一试。预计算
collins\u count*2
在-O1之后不应该有任何改进。除非您更改循环中的值,否则编译器应该自行预计算。请尝试编译并链接
-flto
,有时它可以实现大规模优化。这取决于程序,但通常我发现
-ftlo
-O3
更重要。尝试不同的方法优化选项。有时
-Os
可能比
-O[123]
快,有时
-O2
-O3
-Ofast
快-这都取决于正在优化的代码-有时对不同的文件使用不同的优化级别是有意义的。也可以尝试LTO。
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

    }
  }
}