c++ - header 包含导致代码执行变慢

标签 c++ linker profiling compiler-optimization

我们这里有一个非常大的程序,它混合了 C++ 和 FORTRAN(抱歉)。我的一次 checkin 导致整个应用程序的速度急剧下降(即两倍或更多)——即使是在不受我的更改影响的代码区域也是如此。

事实:

  1. 几乎每个模块的速度都差不多——即使是那些没有使用我的代码的模块也是如此。

  2. 可执行文件大约大 6%。

  3. 元数据在 checkin 之间未更改。

  4. IDE/编译器是 VS2010 Release 模式。

  5. 一些 .lib 文件的大小增加了一倍或三倍。

我查看了其中一个 .lib 文件,它的大小增加了两倍,只有两个变化:

a) 我包含了一个大型头文件,该文件又包含许多其他文件 - 其中一些包含中等复杂的内联代码。 “附加包含目录”已从一个或一个变为大约 7 个,因为每个头文件 #includes 一个或多个其他文件。

b) 我从这个头文件中调用了 4 个函数,但是在运行速度变慢的过程中没有调用这些函数(即它们的执行不会减慢代码速度,但是它们的 < em>包容可能是可以想象的)。

尽管搜索了有关包含头文件是否会减慢执行(相对于编译)的论坛,但我找不到任何相关文章。我的问题是:

<强>? #inclusion 任何形式的 header (声明或内联)是否会减慢代码执行

<强>?包含 内联 代码 w.r.t. 是否存在定性或定量差异?执行速度(我知道“内联”只是给编译器的建议)?

<强>? .lib 大小、.exe 大小和执行速度之间有什么相关性(我预计这里会有很多不同且相互矛盾的相关性)?

<强>?重构一些头文件,使它们不需要包含其他头文件(通过将这些头文件放入 .cpp 文件中,从而减少我的“其他包含目录”)是否会改善我的情况,您认为吗?

我想最后一个问题是问题的核心,因为它需要很多努力...

最佳答案

Does the #inclusion of any form of header (declaration or inline) slow down the code execution?

添加未使用的声明或添加未使用的内联定义不会减慢执行速度。但是,我可以想象有几件事会减慢执行速度:

  • 一些#define 可以防止由另一个 header 进一步提供常用函数的优化内联或宏变体。
  • 重载某些常用操作,可能来自标准库,效率低于默认操作。

Is there are qualitative or quantitative difference in the inclusion of inline code w.r.t. execution speed (I know that 'inline' is only advice to the compiler)?

嗯,如果代码不可用,就无法内联。如果是,那它可以。通常编译器可以估计内联将节省多少,如果没有帮助则不内联,但有时它会猜错。在这种情况下,结果将与通常略有帮助的情况大不相同。

What are the correlations between .lib size, .exe size and execution speed (I'm expecting lots of different and contradictory correlations here)?

完全不同的情况。内联会增加代码大小,但可以在每个调用站点上节省大量工作。但是较大的代码会占用更多的缓存,这会减慢速度。

Will refactoring some of the header files such that they don't need to include others (by putting these includes into a .cpp file, and thus reducing my 'Additional Include Directories') improve my situation, do you think?

可能会也可能不会。视实际原因而定。

我建议你真的应该尝试找出原因。它几乎可以肯定是由某些特定的代码引起的,而不是由包含的代码量引起的。所以回到更改之前的修订版,一点一点地添加包含的内容。首先单独包含最内层的 header ,然后逐一添加使用它们的 header ,依此类推。当您遇到使事情变得更糟的特定 header 时,请尝试注释掉它的一些部分,直到您将其缩小到特定声明或其中的几个。

也只删除一些您观察到性能下降的函数。如果你缩小范围但仍然看不出什么可能是错的,你就会有一些其他人可以重现问题的东西,所以你可以将它用作新问题。

关于c++ - header 包含导致代码执行变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12709500/

相关文章:

windows - MinGW,使用控制台构建 GUI 应用程序

r - 如何在R中高效使用Rprof?

ios - 在 iOS 中,如何从正在运行的应用程序内部获取当前 CPU 利用率?

c++ - 使用不同比例因子缩放单个图像

c++ - 休斯顿,我们有一个 undefined reference

c++ - qtCreator 错误 : can't map file, errno=22 架构 x86_64 文件?

profiling - 如何使用 callgrind 仅分析特定时间段的程序执行?

c++ - 如果调用 cudaMalloc,简单的控制台程序将不会退出

c++ - 为什么不能将指向派生类的指针传递给期望引用指向基类的指针的函数?

c++ - 范围 3D map 可视化(使用 vtk?)