c – 当执行时间(>>执行时间)>>>(编译时)时,多个编译单元是否值得?

根据我的理解,创建具有多个编译单元的程序的主要好处是组件的可重用性和合并小变化时的较短编译时间.

我也认为(可能错误地)存在与此相关的惩罚,因为在它们自己的编译单元中定义的函数不能被声明为“内联”.
[我认识到这个关键字实际上不会强制编译器内联扩展函数,但我的理解是它为编译器提供了更大的优化灵活性,因此值得尽可能包括在内.]

到现在为止还挺好?

我真正的问题是,当程序解决复杂的建模问题时,成本/收益分析是否仍然支持多个编译单元,并且需要在集群上迭代其主循环数月才能生成有用的输出.

假设一个多编译单元程序需要几分钟来编译,而同一个程序重新配置为单个编译单元需要几个小时来编译…如果单个编译单元将所有函数声明为内联,从而提供更多优化机会对我来说,期望执行时间减少几个百分点,而不是弥补额外的编译时间似乎是合理的.

对于像这样的情况,是否有良好的经验法则,还是严重依赖于情境?

最佳答案
正如其他人所说,将程序分解为不同编译单元的主要好处是可读性.
较短的编译时间在某种程度上是一个很好的副作用.

如果你关心内联,你可以求助于Link Time Code Generation and Link-Time Optimization.程序分解到编译单元和LTO的组合看起来是理想的解决方案,虽然目前还不清楚编译器在完全定义函数时执行的优化是什么可以由LTO执行.
例如,我不知道LTO是否可以支持C中的返回值优化,因为它是在高抽象级别完成的.需要进行性能测试.
(编辑:RVO即使在没有LTO和类似的高级技巧的情况下也会执行,至少在gcc和clang上[我试过].很可能,这个优化是通过改变函数的ABI来执行的,它采用了“隐藏指针”到必须在函数中构造和返回的对象.)

第三个可能值得研究的解决方案是使用像sqlite amalgamation这样的过程,将不同的编译单元放入一个巨大的.c文件中.
虽然看起来像需要一个沉重的用户制造基础设施的东西.

转载注明原文:c – 当执行时间(>>执行时间)>>>(编译时)时,多个编译单元是否值得? - 代码日志