Mac 上の C++ で異なる並べ替えアルゴリズムを示すプログラムを作成します。qsort と qsort_b という 2 つのクイックソートの実装が見つかりました。
最初のものはもちろん、昔ながらのどこにでもある 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 MAN ページより)
編集:速度の違い。DATA が 1000000 の場合、qsort は 146832 ns、qsort_b は 127391 ns で終了しました。約 10% 高速であることを考えると、これは比較的大きな違いです。
編集:コードを編集して、さらに大きな整数配列を使用できるようにしました。私の個人的な最大のテスト結果は、100000000 整数、28136278 (28 秒) 対 23870078 (24 秒) です。私にとってはかなり大きな違いです。