【发布时间】:2012-09-24 10:34:18
【问题描述】:
我们这里有一个非常大的程序,它混合了 C++ 和 FORTRAN(抱歉)。我的一次签入导致整个应用程序的速度急剧下降(即两倍或更多)——即使在不受我的更改影响的代码区域也是如此。
事实:
几乎每个模块都减慢了相似的速度 - 即使是那些不使用我的代码的模块。
可执行文件大约大 6%。
在签入之间元数据未更改。
IDE/编译器是VS2010的Release模式。
一些 .lib 文件的大小增加了一倍或三倍。
我查看了一个大小增加了两倍的 .lib 文件,发现只有两个变化:
a) 我已经包含了一个很大的头文件,该头文件又包含许多其他头文件——其中一些包含中等复杂的内联代码。 “其他包含目录”已从无或一变为大约 7 个,因为每个头文件#includes 一个或多个其他。
b) 我从这个头文件中调用了 4 个函数,但是在运行速度变慢的过程中没有调用这些函数(即它们的 执行 不能减慢代码速度,但是它们的 inclusion 可能是)。
尽管搜索了论坛关于是否包含头文件会减慢执行(与编译相反),但我找不到一篇相关文章。我的问题是:
? any 形式的标头(声明或内联)的#inclusion 是否会减慢代码执行?
?包含 inline 代码 w.r.t. 是否存在定性或定量差异?执行速度(我知道“内联”只是对编译器的建议)?
? .lib 大小、.exe 大小和执行速度之间有什么相关性(我预计这里会有很多不同和矛盾的相关性)?
?重构一些头文件以使其不需要包含其他头文件(通过将这些包含放入 .cpp 文件中,从而减少我的“其他包含目录”)会改善我的情况吗?
我想最后一个问题是问题的核心,因为这需要付出很多努力......
【问题讨论】:
-
找一个好的分析器,执行代码,收集每次调用的时间信息,分析然后决定做什么。听起来你是在黑暗中拍摄。
-
如果这是构建时问题,分析不是最有效的途径。如果确实是它而不是其他任何东西导致了这种变化,我建议关注检查本身的内容。
-
对不起:应该说我们已经分析了之前和之后的案例。这就是我们知道它不是我的新功能之一的方式,因为它们几乎没有被调用。所有现有的代码单元都运行得更慢......
标签: c++ linker profiling compiler-optimization