Mik*_*ler 3 c++ linker profiling compiler-optimization
我们这里有一个非常大的程序,它混合了C++和FORTRAN(对不起).我的一次签到导致整个应用程序急剧减速(即两倍或更多) - 即使在代码中不受我的更改影响的区域也是如此.
事实:
几乎每个模块都减慢了相似的数量 - 甚至是那些不使用我的代码的模块.
可执行文件大约增加6%.
签入之间未更改元数据.
IDE /编译器处于发布模式的VS2010.
一些.lib文件的大小增加了一倍或三倍.
我看了一个大小增加了三倍的.lib文件,只有两个变化:
a)我已经包含了一个大型的头文件,而该文件又包含许多其他文件 - 其中一些包含中等复杂的内联代码."附加包含目录"已经从非一个或一个变为大约7个,因为每个头文件#include一个或多个其他头文件.
b)我从这个头文件中调用了4个函数,但是这些函数在运行期间没有被调用(即它们的执行不能减慢代码速度,但可能会包含它们).
尽管在论坛中搜索包含头文件是否会减慢执行速度(而不是编译),但我找不到一篇相关的文章.我的问题是:
?任何形式的头文件(声明或内联)的#inclusion是否会减慢代码执行速度?
?内联代码的执行速度是否存在定性或定量差异(我知道'内联'只是对编译器的建议)?
?.lib大小,.exe大小和执行速度之间有什么相关性(我期待这里有很多不同且相互矛盾的相关性)?
?将重构一些头文件,以便他们不需要包含其他文件(通过将这些包含放入.cpp文件,从而减少我的'其他包含目录')改善我的情况,你觉得呢?
我想最后一个问题是问题的关键,因为它需要付出很多努力......
任何形式的头文件(声明或内联)的#inclusion是否会减慢代码执行速度?
添加未使用的声明或添加未使用的内联定义不会减慢执行速度.但是我可以想象一些可以减慢执行速度的事情:
内联代码的执行速度是否存在定性或定量差异(我知道'内联'只是对编译器的建议)?
好吧,如果代码不可用,则无法内联.如果是,那就可以.通常编译器可以估计内联将保存多少内存,如果它没有帮助则不内联,但偶尔会猜错.在这种情况下,结果将与通常略有帮助的情况大不相同.
.lib大小,.exe大小和执行速度之间有什么相关性(我期待这里有很多不同且相互矛盾的相关性)?
完全不同的个案.内联使代码大小膨胀,但可以在每个调用站点上节省大量工作.但是更大的代码占用更多的缓存,这会减慢它的速度.
将重构一些头文件,以便他们不需要包含其他文件(通过将这些包含放入.cpp文件,从而减少我的'其他包含目录')改善我的情况,你觉得呢?
它可能会也可能不会.取决于实际原因.
我建议你应该尽力找到原因.它几乎肯定是由一些特定的代码引起的,而不是包含的代码量.因此,在更改之前返回修订版并逐位添加.首先包括最里面的标题,然后逐个添加使用它们的标题等.当你到达使事情变得更糟的特定标题时,尝试评论它的位,直到你将它缩小到特定声明或其中几个.
还要考虑一些观察性能下降的功能.如果你缩小范围并且仍然看不出可能出现的问题,那么你就会有其他东西可以重现这个问题,所以你可以将它作为新问题使用.
| 归档时间: |
|
| 查看次数: |
1538 次 |
| 最近记录: |