[英]Performance impact of 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
这是一个广泛的问题,通常的怀疑(就我而言)是在生成的代码中递归处理可变参数模板参数。
您需要检查现在使用可变参数template参数的方法是否以仅在编译时而不是在运行时进行递归的方式实现。 为了给您一些想法,您可能需要查看一些示例,例如我的这个答案 。 递归发生在编译时,真正的代码是单步转发和扩展。
尽管您写了什么,但我确实希望您实际上必须修改一些代码,否则Args
只能容纳一个参数,而别无其他选择,而拥有可变参数模板参数完全没有意义-如果我错了,请原谅; )(根据您的评论,它可能会在将参数包传递到的代码中触发类似上面的内容)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.