c++ - 拆分标头和实现会导致显着减速
问题描述
当我在 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)
解决方案
推荐阅读
- symfony - Doctrine 的实体监听器的行为不一致
- scala - Spark:按键减少/聚合
- python - 需要帮助或理解
- windows - 从 Android Studio 运行我的应用程序时,我可以强制模拟器到顶部吗?
- css - iPhone XR / XS / XS Max CSS 媒体查询
- scala - 现在 22 不再是限制,Scala 案例类中允许的实际最大字段数是多少?
- linux - 查找:在 Linux 中缺少“-exec”的参数
- javascript - 文本区域的动态高度
- c# - roslyn 未使用 PackageReference 和 Microsoft.CodeDom.Providers 2.0.0 复制到 AspNet Mvc 5 项目的 bin
- postman - 读取作为文本发布到金字塔网络应用程序的文件