合并排序现在比现代机器上的QuickSort好吗?

时间:2012-12-12 15:52:30

标签: c++ linux windows performance optimization

既然现代机器都是多核的,我们支持带有SSE指令的Windows和Linux机器上的SIMD指令,例如,我应该切换到我的C / C ++代码中的合并排序而忘记QuickSort吗?从理论上讲,这样做的原因是合并排序会更好地并行化并更节省地使用内存/磁盘,因此比QuickSort的内存密集型操作更快,但我不知道。实践经验表明了什么?

每次我排序时,我都不想分析和测试。我想使用一种标准方法。目前该方法是QuickSort,因为这是默认的库排序例程。我想知道是否还有其他人切换到MergeSort并通过切换获得了更好的结果。

UPDATE ------------

Graham.Reeds对How big is the performance gap between std::sort and std::stable_sort in practice?的回答表明,我上面的猜测是正确的,切换到MergeSort / stablesort可能是正确的。

5 个答案:

答案 0 :(得分:2)

在得到很多非答案后,我花了几个小时做了自己的研究。结果是,是的,合并排序(和其他相关的排序)将由于较少的内存使用和更好的并行/多核开发而显着更快。此外,英特尔还有一个标准的高性能库,称为IPP,它为x86机器实现合并类型排序。通过切换到这个库,看起来我可以大大改进我的编程类型的排序性能(和其他矢量类型操作)。

答案 1 :(得分:1)

我认为没有明确的答案。在某些情况下,可并行的蛮力分类可能会更快。分析您的具体案例始终很重要。还要考虑比特序,例如,如果你有多个核心和SIMD。

答案 2 :(得分:1)

  

我应该在我的C / C ++代码中切换到合并排序而忘记QuickSort吗?

很抱歉这样说,但问题听起来像是过早优化的尝试。

  

理论上,这样做的原因是合并排序将更好地并行化并更节省地使用内存/磁盘,因此比QuickSort的内存密集型操作更快,但我不知道。实践经验表明了什么?

实际上,您应该首先进行分析,然后根据结果确定优化区域。

您可能甚至不需要更改您使用的排序算法,除非您通过足够大的数据集使结果变得重要(或者在处理流程的关键区域,或者物质)。

我通常使用std :: sort,如果这还不够(std::sort尚未发生),我会优化我的应用程序流和算法。

答案 3 :(得分:0)

事实是你必须自己对它进行分析,看看它对你的应用程序,数据,环境等的行为方式。这实质上是对所有关于SO的所有性能分析/性能/优化问题的回答。

答案 4 :(得分:0)

有并行排序包可根据处理器中的核心数进行扩展,旨在利用/优化每个处理器上的处理。我知道TBB(线程构建块)有一个parallel_sort函数,它是一个比较排序,平均时间复杂度为0(n log n)。

您还可以在快速排序中实现一些线程。递归函数可以使用TBB中的parallel_for轻松转换为并行性,或者您可以查看Cilk Plus,网上有许多线程示例。