我有一个简单的模板头,其中包含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标志进行编译。
答案 0 :(得分:0)
如果您声明功能模板是静态的,这是否会导致每个翻译单元(编译的目标文件)生成一份该副本?可能会导致生成该方法的3个副本,是的,缓存问题。
摆脱static
关键字是否可以解决性能问题?
答案 1 :(得分:0)
在编译主程序时,优化标志被遗漏了,可能是CMake错误。当将模板实例化单独编译为库时,正在使用优化标志,从而使程序运行很快。我强制将优化标志用于直接包含模板的主程序中,并且现在它的运行速度同样快。
出于好奇:inline
和static
关键字是无害的-删除它们不会改变速度。实际上,尽管有我的提示,编译器并没有内联函数,因为它知道什么时候不应该。使用__attribute__((always_inline))
强制内联会使编译非常慢,并且运行时性能也会降低一点(2x)。