在Mac上编写一个展示不同排序算法的C++程序。我发现了两个快速排序的实现,qsort和qsort_b。
第一个当然是老式的,到处都能看到的qsort。但是有qsort_b,它使用块而不是函数。下面是我的代码:
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <cstdio>
#include <ctime>
#define DATA 1000000
using namespace std;
int compare(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
int main(int argc, char *argv[])
{
int* array = new int[DATA];
srand(time(0));
for ( int i = 0 ; i < DATA ; ++ i )
{
array[i] = rand() % 2147483647;
}
clock_t begin = clock();
qsort(array, DATA, sizeof(array[0]), compare);
//qsort_b(array, DATA, sizeof(array[0]), ^(const void* a, const void* b) { return *(int*)a - *(int*)b; });
clock_t end = clock();
cout << "Time it takes to sort " << DATA << " integers with quicksort: " << end - begin;
}
在这里,我看到了很大的速度差异,是什么导致了所有这些差异。据我理解,块用于并行处理,在这种情况下不会比函数更快。没有什么可以并行处理的,对吧?
编辑:heapsort_b(),mergesort_b()和qsort_b()例程类似于没有_b后缀的相应例程,只是compar回调是块指针而不是函数指针。(来自BSD手册页)
编辑:速度差异。对于DATA为1000000,qsort在146832 ns内完成,而qsort_b在127391 ns内完成。考虑到它约快10%,这是一个相对较大的差异。
编辑:我已经编辑了代码,使得可能拥有更大的整数数组。我的个人最大测试结果是100000000个整数,28136278(28秒)与23870078(24秒)。对我来说,这是一个相当大的差异。
qsort_b
这样的函数也是如此 - 调用可能更快,但真正的内联无法发生,因为qsort_b
本身已经被编译。 - user4815162342