【发布时间】:2011-06-10 03:15:43
【问题描述】:
根据 Scott Meyers 在其 Effective STL 书 - 第 46 项中的说法。他声称 std::sort 比 std::qsort 快约 670%,因为它是内联的。我测试了自己,发现 qsort 更快 :( !谁能帮我解释一下这种奇怪的行为?
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <cstdio>
const size_t LARGE_SIZE = 100000;
struct rnd {
int operator()() {
return rand() % LARGE_SIZE;
}
};
int comp( const void* a, const void* b ) {
return ( *( int* )a - *( int* )b );
}
int main() {
int ary[LARGE_SIZE];
int ary_copy[LARGE_SIZE];
// generate random data
std::generate( ary, ary + LARGE_SIZE, rnd() );
std::copy( ary, ary + LARGE_SIZE, ary_copy );
// get time
std::time_t start = std::clock();
// perform quick sort C using function pointer
std::qsort( ary, LARGE_SIZE, sizeof( int ), comp );
std::cout << "C quick-sort time elapsed: " << static_cast<double>( clock() - start ) / CLOCKS_PER_SEC << "\n";
// get time again
start = std::clock();
// perform quick sort C++ using function object
std::sort( ary_copy, ary_copy + LARGE_SIZE );
std::cout << "C++ quick-sort time elapsed: " << static_cast<double>( clock() - start ) / CLOCKS_PER_SEC << "\n";
}
这是我的结果:
C quick-sort time elapsed: 0.061
C++ quick-sort time elapsed: 0.086
Press any key to continue . . .
更新
有效的 STL 第 3 版 ( 2001 )
第 7 章 STL 编程
第 46 条:考虑函数对象而不是函数作为算法参数。
【问题讨论】:
-
你让你的编译器优化了吗?调试/未优化的构建不会充分利用内联等功能。
-
了解快速排序的工作原理,会让您更好地了解如何测试它,简而言之: 1. 使用更大的数组,例如:10^6 大小,然后以降序填充数组order 999999... 4,3,2,1 - 这将导致排序变为 O(n^2),这样做将有效地证明为什么内联比较器会在这个特定算法中产生如此大的差异。
-
@Zenikoder- 几乎没有
qsort或sort的实现会使用在反向排序输入上中断的快速排序实现。最常见的 STLsort实现使用 introsort,它对快速排序例程进行内省,以确保它永远不会降级到比 O(n lg n) 更差,而且我相当有信心 Cqsort例程使用类似的东西(或至少有一个启发式方法,比如三中位数)来防止这种情况发生。 -
@Noah:根据 06 年关于 artima SM 的一篇文章:“我将从你们中的许多人会发现的一个不可挽回的忏悔开始:我已经 20 多年没有编写生产软件了,而且我从未用 C++ 编写过生产软件。”他称自己是 C++ 语言的考古学家/人类学家。
-
@Chan:本特利和麦克罗伊的论文可以在这里找到:cs.ubc.ca/local/reading/proceedings/spe91-95/spe/vol23/issue11/…
标签: c++ performance sorting stl