Pisanie programu, który demonstruje inny algorytm sortowania w C++ na Macu. Znalazłem dwie implementacje quicksort, qsort i qsort_b.qsort_b i qsort
Pierwszy to oczywiście staroświecki, widziany wszędzie qsort. Ale istnieje qsort_b, który przyjmuje blok, a nie funkcję. Oto mój kod:
#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;
}
Widzę tutaj dużą różnicę prędkości, co powoduje tę różnicę. Rozumiem, że bloki są przeznaczone do przetwarzania równoległego, które w tym przypadku nie będą szybsze niż funkcje. Nie ma nic do równoległego procesu, prawda?
EDYCJA: Procedury heapsort_b(), mergesort_b() i qsort_b() są podobne do odpowiednich procedur bez sufiksu _b, należy oczekiwać, że porównawcze wywołanie zwrotne jest wskaźnikiem bloku zamiast wskaźnika funkcji. (FROM BSD MAN PAGE)
EDYCJA: Różnica prędkości. Gdy DATA to 1000000, qsort ukończył go w 146832 ns, z qsort_b, w 127391 ns. Jest to stosunkowo duża różnica, ponieważ jest o około 10% szybsza.
EDYCJA: Zmodyfikowałem kod, aby umożliwić uzyskanie większej liczby liczb całkowitych. Mój osobisty największy wynik testu to 100000000 liczb całkowitych, 28136278 (28s) vs. 23870078 (24s). To dla mnie ogromna różnica.
Czy możesz rozwinąć "dużą różnicę prędkości"? –
@KarthikT Nie jestem pewien z jednostką miary, ale myślę, że to nanosekunda. Z qsort, to 146832, z qsort_b, to 127391. Z DATA będącym 1000000. –
Przetestowałem to z coraz większymi danymi, 100000000 liczb całkowitych. Jest to 28136278 (28s) vs. 23870078 (24s). To dla mnie ogromna różnica. –