c – 排序:这种性能差异是真的还是我做错了?

c – 排序:这种性能差异是真的还是我做错了?,第1张

概述我需要排序很多由8个浮点组成的小数组.最初我使用std :: sort但对其性能不满意,我尝试了由此生成的比较交换算法: http://pages.ripco.net/~jgamble/nw.html 测试代码如下: template <typename T>bool PredDefault(const T &a, const T &b) {return a > b;}template <t 我需要排序很多由8个浮点组成的小数组.最初我使用std :: sort但对其性能不满意,我尝试了由此生成的比较交换算法: http://pages.ripco.net/~jgamble/nw.html

测试代码如下:

template <typename T>bool PredDefault(const T &a,const T &b) {return a > b;}template <typename T>bool PredDefaultReverse(const T &a,const T &b) {return a < b;}template <typename T>voID Sort8(T* Data,bool(*pred)(const T &a,const T &b) = PredDefault) {    #define Cmp_Swap(a,b) if (pred(Data[a],Data[b])) {T tmp = Data[a]; Data[a] = Data[b]; Data[b] = tmp;}    Cmp_Swap(0,1); Cmp_Swap(2,3); Cmp_Swap(4,5); Cmp_Swap(6,7);    Cmp_Swap(0,2); Cmp_Swap(1,6); Cmp_Swap(5,7);    Cmp_Swap(1,2); Cmp_Swap(5,6); Cmp_Swap(0,4); Cmp_Swap(3,7);     Cmp_Swap(1,5); Cmp_Swap(2,6);      Cmp_Swap(1,6);    Cmp_Swap(2,5);    Cmp_Swap(3,4);}int lastTick;int tick() {    int hold = lastTick;    lastTick = GetTickCount();    return lastTick - hold;}int main(){    vector<vector<float>> rVec(1000,vector<float>(8));     for (auto &v : rVec) {        v[0] = ((float)rand()) * 0.001;        v[1] = ((float)rand()) * 0.001;        v[2] = ((float)rand()) * 0.001;        v[3] = ((float)rand()) * 0.001;        v[4] = ((float)rand()) * 0.001;        v[5] = ((float)rand()) * 0.001;        v[6] = ((float)rand()) * 0.001;        v[7] = ((float)rand()) * 0.001;    }    system("PAUSE");    tick();    for (int n = 0; n < 50000; n++)    for (int j = 0; j < rVec.size(); j++) {        std::sort(rVec[j].begin(),rVec[j].end(),PredDefault<float>);        std::sort(rVec[j].begin(),PredDefaultReverse<float>);        //Sort8(rVec[j].data(),PredDefault<float>);        //Sort8(rVec[j].data(),PredDefaultReverse<float>);    }    cout << "\nTime: " << tick() << "\n";    system("PAUSE");    return 1;}

在测试一个或另一个时添加/删除注释标记.

我没有期待太多,但差异是10倍支持交换排序的东西(在vs2012的发布配置中完成测试,关闭了节能功能).结果也检查出来.这是正确的吗?

解决方法 有几个原因我可以想到.

>您有硬编码比较.这有助于管道化多个指令,从而提高效率.但想象一下编码为N = 1000.你必须写1000 * 1000比较.> std :: sort进行O(nlogn)比较.但是这个大O符号适用于大N,因为符号常量可能很大.因此,您无法通过运行8个值的范围来判断效率.

总结

以上是内存溢出为你收集整理的c – 排序:这种性能差异是真的还是我做错了?全部内容,希望文章能够帮你解决c – 排序:这种性能差异是真的还是我做错了?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1227553.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存