blu*_*rni 3 c++ gcc templates variadic-templates c++11
在我的代码的最新一轮重构中,我用可变参数对应的固定数量的模板参数替换了一堆模板类。当我发现一个特定的性能测试用例的性能下降了大约 20-30% 时,我感到非常困惑。
几次 git bisect 往返后,发现了违规提交。从字面上看,它由一个单一的变化组成
template <typename T, typename U>
class foo {};
Run Code Online (Sandbox Code Playgroud)
到
template <typename T, typename ... Args>
class foo {};
Run Code Online (Sandbox Code Playgroud)
我已经通过实验证实,应用这个单一的变化会导致上述减速。更令人费解的是,切换编译器版本(从 GCC 4.7 到 GCC 4.8)会将速度降低的发生移到另一个类似的提交(即,另一个从固定参数到可变参数的切换,但在不同的类中bar
)。
为了提供一些上下文,这个特定的性能测试用例是一个非常稀疏的计算机代数问题,它受内存限制,因此非常容易受到高效缓存内存利用的影响。这个测试用例在我的代码中一直是一个有问题的地方(例如,在 GCC 4.4/4.5 附近,我曾经不得不手动调整管理缓存行大小检测的编译器选项,以提取最大性能)。
有没有人知道是什么导致了这种行为?不幸的是,我担心提取简化的测试用例可能非常困难。
编辑
作为参考,这是恢复良好性能行为的提交。不幸的是,它包括对一堆类(而不是一个类)的恢复到非可变参数代码。我将尝试提出一个更局限的例子。
https://gitorious.org/piranhapp0x/mainline/commit/b952c613b42fe480fe4ed2dfd3e683eb9e38e4cd
归档时间: |
|
查看次数: |
2152 次 |
最近记录: |