直接包含模板比单独实例化慢

时间:2019-03-14 23:59:40

标签: c++ performance templates compiler-optimization gcc5

我有一个简单的模板头,其中包含3个模板函数(没有声明,只有定义并标记为static inline), 其中两个功能的长度为5000行。这些长函数非常简单,但是很长,因为它们采用应变式程序形式/无循环。在我使用模板实例化的主程序文件上,如果我直接包含模板文件,则该程序的运行速度比构建一个单独的c ++文件包含模板并实例化并将其链接为一个实例的速度慢大约10倍。静态库(已使用-fPIC)。为什么?

是不是编译器太慢,指令缓存变得混乱,编译器突然在不需要的时候内联了long函数,还是其他原因?

代码经过高度优化,在Mac OS 10.14.3中使用-O3 -ffast-math -march=native -std=gnu++11和GCC 5.5.0标志进行编译。

2 个答案:

答案 0 :(得分:0)

如果您声明功能模板是静态的,这是否会导致每个翻译单元(编译的目标文件)生成一份该副本?可能会导致生成该方法的3个副本,是的,缓存问题。

摆脱static关键字是否可以解决性能问题?

答案 1 :(得分:0)

在编译主程序时,优化标志被遗漏了,可能是CMake错误。当将模板实例化单独编译为库时,正在使用优化标志,从而使程序运行很快。我强制将优化标志用于直接包含模板的主程序中,并且现在它的运行速度同样快。

出于好奇:inlinestatic关键字是无害的-删除它们不会改变速度。实际上,尽管有我的提示,编译器并没有内联函数,因为它知道什么时候不应该。使用__attribute__((always_inline))强制内联会使编译非常慢,并且运行时性能也会降低一点(2x)。