首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序:这是真正的性能差异,还是我做错了什么?

排序:这是真正的性能差异,还是我做错了什么?
EN

Stack Overflow用户
提问于 2015-03-05 03:26:08
回答 1查看 102关注 0票数 4

我需要对许多由8个浮点数组成的小数组进行排序。最初我使用的是std::sort,但是对它的性能不满意,我尝试了一种由以下代码生成的比较交换算法:http://pages.ripco.net/~jgamble/nw.html

测试代码如下:

代码语言:javascript
复制
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, 3); Cmp_Swap(4, 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, 4); Cmp_Swap(3, 6);
    Cmp_Swap(2, 4); Cmp_Swap(3, 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(), rVec[j].end(), PredDefaultReverse<float>);
        //Sort8(rVec[j].data(), PredDefault<float>);
        //Sort8(rVec[j].data(), PredDefaultReverse<float>);
    }

    cout << "\nTime: " << tick() << "\n";
    system("PAUSE");

    return 1;
}

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

我并没有期望太多,但差别是10倍,赞成交换排序(在vs2012上的发布配置中完成的测试,并关闭了节能功能)。结果也证实了。是这样的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-05 03:55:20

有几个原因我可以马上想出来。

  1. 你有硬编码的比较。这有助于管道衬里多指令,这使它的高效率.但是想象一下为N=1000编写代码。你必须写1000*1000的比较。
  2. std::sortO(nlogn)比较。但是这个大O符号对于大N是成立的,因为符号的常数可以是大的。因此,您不能通过运行范围为8个值来判断效率。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28869451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档