我有一些性能关键的代码,涉及用C ++中约3到10个元素(参数在编译时更改)对非常短的固定长度数组进行排序。
我想到一个专门针对每个可能的输入大小的静态排序网络可能是一个非常有效的方法:我们做所有必要的比较来确定我们在哪个情况下,然后做最佳的交换次数来排序数组。
为了应用这个,我们使用一些模板魔法来推导出数组长度并应用正确的网络:
#include <iostream>
using namespace std;
template< int K >
void static_sort(const double(&array)[K])
{
cout << "General static sort\n" << endl;
}
template<>
void static_sort<3>(const double(&array)[3])
{
cout << "Static sort for K=3" << endl;
}
int main()
{
double array[3];
// performance critical code.
// ...
static_sort(array);
// ...
}
显然,编码所有这一切是一件很麻烦的事情,所以:
- 有没有人有任何意见,这是否值得这个努力?
- 有谁知道这个优化是否存在于任何标准的实现,例如,std :: sort?
- 是否有一个容易的地方来获得执行这种分类网络的代码?
- 也许这将有可能使用模板魔术静态生成这样的排序网络。
现在我只是使用插入排序与静态模板参数(如上),希望它会鼓励展开和其他编译时优化。
你的想法欢迎。
更新:我写了一些测试代码来比较“静态”插入短和std :: sort。 (当我说静态时,我的意思是数组的大小是固定的,并在编译时推导出来(大概是允许循环展开等等),我得到了至少20%的NET改进(注意时代包含了这一代)平台:铛,OS X 10.9。
代码在这里https://github.com/rosshemsley/static_sorting,如果你想比较它到你的stdlib的实现。
我还没有找到比较网络分拣机的一个很好的实现。