c++ - 可变参数模板的性能影响

标签 c++ templates gcc c++11 variadic-templates

在我的代码的最新一轮重构中,我将一堆具有固定数量模板参数的模板类替换为可变参数。当我发现一个特定的性能测试用例的性能下降了大约 20-30% 时,我感到非常困惑。

几次 git bisect 往返之后,发现了有问题的提交。从字面上看,它由一个单一的变化组成

template <typename T, typename U>
class foo {};

template <typename T, typename ... Args>
class foo {};

我已经通过实验确认应用此单一更改会产生上述减速。更令人费解的是,切换编译器版本(从 GCC 4.7 到 GCC 4.8)将减速发生转移到另一个类似的提交(即,另一个从固定参数到可变参数的切换,但在不同的类 bar 中)。

为了提供一些上下文,这个特定的性能测试用例是一个非常稀疏的计算机代数问题,它受内存限制,因此很容易受到高效缓存内存利用的影响。这个测试用例一直是我的代码中的一个问题点(例如,在 GCC 4.4/4.5 周围,我过去不得不手动调整编译器选项来管理缓存行大小的检测,以提取最大性能)。

有没有人知道是什么导致了这种行为?不幸的是,我担心提取简化的测试用例会非常困难。

编辑

作为引用,这是恢复良好性能行为的提交。不幸的是,它包括对一堆类(而不是只有一个类)的非可变代码的恢复。我将尝试提出一个更具体的示例。

https://gitorious.org/piranhapp0x/mainline/commit/b952c613b42fe480fe4ed2dfd3e683eb9e38e4cd

最佳答案

这是一个广泛的问题,通常怀疑(就我而言)是在生成的代码中递归处理可变模板参数。

您需要检查现在使用可变模板参数的方法是否以递归仅发生在编译时而非运行时的方式实现。为了给您一些想法,您可能需要查看一些示例,例如 this answer of mine .递归发生在编译期,真正的代码是单步转发和展开。

不管你写了什么,我确实希望你实际上必须调整一些代码,否则 Args 只能包含一个参数,而拥有可变参数模板将毫无意义参数 - 如果我错了,请原谅我;)(根据您的评论,它可能会在您将参数包传递给的代码中触发类似上面的内容)

关于c++ - 可变参数模板的性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18985898/

相关文章:

c++ - 时间偏移计算偏差一分钟

c++ - 我坚持使用 C++ 中的模板类

c++对模板类的用户定义运算符的隐式转换

visual-studio - gcc和MS预处理器之间的另一个区别

windows - 是否有任何支持 GCC 插件的 mingw-w64 版本?

c++ - 通过 C++ 在控制台中使用 Unicode 字符

c++ - 如何回到文本文件的第一个

c - 如何得到C程序的空间复杂度?

c++ - 使用 vi[m] 自动为#define 生成值

php - Laravel 5.2 在 Blade 中使用变量的正确方法