117 lines
2.6 KiB
C
117 lines
2.6 KiB
C
#include "ms.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <sys/types.h>
|
|
#include <errno.h>
|
|
|
|
struct timespec timespecdiff(struct timespec start, struct timespec end)
|
|
{
|
|
struct timespec temp;
|
|
if ((end.tv_nsec - start.tv_nsec) < 0) {
|
|
temp.tv_sec = end.tv_sec - start.tv_sec - 1;
|
|
temp.tv_nsec = 1000000000 + end.tv_nsec - start.tv_nsec;
|
|
} else {
|
|
temp.tv_sec = end.tv_sec - start.tv_sec;
|
|
temp.tv_nsec = end.tv_nsec - start.tv_nsec;
|
|
}
|
|
|
|
return temp;
|
|
}
|
|
|
|
void shuffle(int foo[], size_t len)
|
|
{
|
|
int i;
|
|
int x;
|
|
int t;
|
|
|
|
for (i = 0; i < len; ++i) {
|
|
x = random() % len;
|
|
t = foo[x];
|
|
foo[x] = foo[i];
|
|
foo[i] = t;
|
|
}
|
|
}
|
|
|
|
int check_arr(int foo[], size_t len)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < len; ++i) {
|
|
if (foo[i] != i) {
|
|
return 0;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int i;
|
|
int *foo;
|
|
int len;
|
|
struct timespec start, end;
|
|
struct timespec diff;
|
|
long diffms;
|
|
int x;
|
|
int forklimitsz;
|
|
|
|
len = 50000001;
|
|
forklimitsz = 3;
|
|
foo = (int *) malloc(sizeof(int *) * len);
|
|
if (foo == NULL) {
|
|
fprintf(stderr, "Not enough memory\n");
|
|
exit(1);
|
|
}
|
|
for (i = 0; i < len; ++i) {
|
|
foo[i] = i;
|
|
}
|
|
|
|
srandom(time(NULL));
|
|
printf("arr len: %d\n", len);
|
|
for (x = 0; x < 2; ++x) {
|
|
if (x == 0) {
|
|
printf("linear\n");
|
|
} else {
|
|
printf("parallel\n");
|
|
}
|
|
shuffle(foo, len);
|
|
|
|
if (len <= 100) {
|
|
printf("sorting arr: \n");
|
|
for (i = 0; i < len; ++i) {
|
|
printf(" %d", foo[i]);
|
|
}
|
|
printf("\n");
|
|
}
|
|
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
|
|
if (x == 0) {
|
|
mymergesort(foo, len);
|
|
} else {
|
|
if (mymergesortp(foo, len, forklimitsz) < 0) {
|
|
perror("mergesortp");
|
|
}
|
|
}
|
|
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
|
|
if (len <= 100) {
|
|
printf("sorted arr: \n");
|
|
for (i = 0; i < len; ++i) {
|
|
printf(" %d", foo[i]);
|
|
}
|
|
printf("\n");
|
|
}
|
|
if (check_arr(foo, len) == 0) {
|
|
printf("ERROR in sort\n");
|
|
} else {
|
|
printf("sort OK\n");
|
|
diff = timespecdiff(start, end);
|
|
diffms = diff.tv_sec * 1000 + diff.tv_nsec / 1000000;
|
|
printf("duration: %lds %ldns\n\t%ldms\n", diff.tv_sec, diff.tv_nsec, diffms);
|
|
}
|
|
}
|
|
|
|
free(foo);
|
|
|
|
return 0;
|
|
}
|
|
|