-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathbench_sort.c
More file actions
151 lines (128 loc) · 3.91 KB
/
Copy pathbench_sort.c
File metadata and controls
151 lines (128 loc) · 3.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include "opencstl/opencstl.h"
typedef long long DTYPE;
//typedef double DTYPE;
#define COMPARE(TYPE) int cmp(const void* a, const void* b) {return *(TYPE *) a < *(TYPE *) b ? -1 : *(TYPE *) a > *(TYPE *) b;}
COMPARE(DTYPE);
typedef int (*CMPFUNC)(const void *, const void *);
#if defined(OCSTL_OS_MACOS) && defined(OCSTL_CC_TCC)
#include <dlfcn.h>
typedef void (*MSORT_FUNC)(
void *base,
size_t number,
size_t width,
int (*compare)(const void *, const void *)
);
MSORT_FUNC msort_v2;
#endif
int sort_test() {
#if defined(OCSTL_OS_MACOS) && defined(OCSTL_CC_TCC)
void *handle = dlopen("./msort.dylib", RTLD_NOW);
if (!handle) {
fprintf(stderr, "dlopen failed: %s\n", dlerror());
return 1;
}
dlerror();
msort_v2 = (MSORT_FUNC) dlsym(handle, "msort");
#endif
CMPFUNC compare = cmp;
DTYPE N = 1000000;
size_type64 ALGORITHMS = 7;
size_type64 REPEAT = 10;
// DTYPE *arr = (DTYPE *) calloc(N, sizeof(DTYPE));
VECTOR(DTYPE) arr = new_vector(DTYPE);
for (int i = 0; i < N; i++) {
//arr[i] = rand() * 1.0 * rand();
DTYPE val = rand() * rand();
push_back(arr, val);
//printf("arr[%d] = %d\n", i, arr[i]);
}
DTYPE *target = (DTYPE *) calloc(N, sizeof(DTYPE));
double t_beg;
double t_end;
double m_diff = 0;
double q_diff = 0;
double t_diff = 0;
double p_diff = 0;
double r_diff = 0;
double pm_diff = 0;
double ipn_diff = 0;
for (int i = 0; i < ALGORITHMS * REPEAT; i++) {
mt19937.shuffle(arr);
memcpy(target, arr, N * sizeof(DTYPE));;
switch (i % ALGORITHMS) {
case 0: {
t_beg = ttime();
qsort(target, N, sizeof(DTYPE), compare);
t_end = ttime();
q_diff += t_end - t_beg;
};
break;
case 1: {
t_beg = ttime();
#if defined(OCSTL_OS_MACOS) && defined(OCSTL_CC_TCC)
msort_v2(target, N, sizeof(DTYPE), compare);
#else
msort(target, N, sizeof(DTYPE), compare);
#endif
t_end = ttime();
m_diff += t_end - t_beg;
};
break;
case 2: {
t_beg = ttime();
tsort(target, N, sizeof(DTYPE), compare);
t_end = ttime();
t_diff += t_end - t_beg;
};
break;
case 3: {
t_beg = ttime();
pdqsort(target, N, sizeof(DTYPE), compare);
t_end = ttime();
p_diff += t_end - t_beg;
}
break;
case 4: {
t_beg = ttime();
rsort(target, N);
t_end = ttime();
r_diff += t_end - t_beg;
}
break;
case 5: {
t_beg = ttime();
pmsort(target, N, sizeof(DTYPE), compare);
t_end = ttime();
pm_diff += t_end - t_beg;
}
break;
case 6: {
t_beg = ttime();
ipnsort(target, N, sizeof(DTYPE), compare);
t_end = ttime();
ipn_diff += t_end - t_beg;
}
break;
default: {
exit(-1);
};
}
if (is_sorted(target, N, sizeof(DTYPE), compare) == -1) {
puts("Not sorted");
}
}
printf("|ENV/SORTING|%s|%s|%s|%s|%s|%s|%s|\n", "qsort", "msort", "tsort", "pdqsort", "rsort", "pmsort", "ipnsort");
printf("|-|-|-|-|-|-|-|-|\n");
printf("|%s/%s|%.2f|%.2f|%.2f|%.2f|%.2f|%.2f|%.2f|\n",OCSTL_OS_STR,OCSTL_CC_STR,
q_diff, m_diff, t_diff, p_diff, r_diff, pm_diff, ipn_diff);
free(target);
destroy(arr);
#if defined(OCSTL_OS_MACOS) && defined(OCSTL_CC_TCC)
dlclose(handle);
#endif
return 0;
}
int main() {
cpu_pin();
sort_test();
}