首页 > 解决方案 > 拆分标头和实现会导致显着减速

问题描述

当我在 c++ 中拆分标头和实现时,我发现与仅标头相比,在某些情况下会出现明显的减速。最小的工作示例如下所示。在下面的例子中,get_sum函数是在头文件中实现的get_sum2,而与 完全相同的实现get_sum是在impl.cpp. 结果表明,执行时间为 0.001 [msec]get_sum和 1066.84 [msec] get_sum2(请参阅参考资料main.cpp),尽管两者具有相同的实现。谁能解释为什么会这样?

可以在此处找到以下代码。

头文件header.h

#include<vector>
#include<iostream>

using namespace std;
class Tester
{
  public:
    Tester(int n){ 
      table_.resize(n);
      for(int i=0; i<n; i++){
        table_[i].resize(n);
      }
    }

    bool get_sum(){
      double s = 0;
      for(auto& subtable : table_){
        for(double e : subtable){
          s += e;
        }
      }
      return s;
    }
    bool get_sum2(); // definition is in impl.cpp
  private:
    vector<vector<double>> table_;
};

实施文件impl.cpp

bool Tester::get_sum2(){
  double s = 0;
  for(auto& subtable : table_){
    for(double e : subtable){
      s += e;
    }
  }
  return s;
}

基准测试的主文件main.cpp

#include "header.h"
int main(){
  int size = 30000;
  auto tester = Tester(size);
  std::cout << "Finish constructing the tester" << std::endl; 
  {
    clock_t start = clock();
    tester.get_sum();
    clock_t end = clock();
    std::cout << (end - start)/1000.0 << " [msec]" << std::endl; 
  }

  {
    clock_t start = clock();
    tester.get_sum2();
    clock_t end = clock();
    std::cout << (end - start)/1000.0 << " [msec]" << std::endl; 
  }
}

执行的输出main.cpp

Finish constructing the tester
0.001 [msec]
1054.71 [msec]

使用的cmake 脚本CmakeLists.txt(注意使用发布模式构建)

cmake_minimum_required(VERSION 3.4 FATAL_ERROR)
set(CMAKE_BUILD_TYPE Release)
add_executable(main main.cpp impl.cpp)

标签: c++performanceheader-files

解决方案


推荐阅读