Skip to content

Commit ebc730c

Browse files
committed
Apply minibench to codebase
1 parent d0d37af commit ebc730c

File tree

4 files changed

+605
-2
lines changed

4 files changed

+605
-2
lines changed

map/CMakeLists.txt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1+
enable_testing()
2+
13
set(CMAKE_C_STANDARD 99)
24
set(CMAKE_C_STANDARD_REQUIRED TRUE)
35
set(CMAKE_VERBOSE_MAKEFILE TRUE)
46
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
57
set(GCC_FLAGS "-std=c99-s -Os -W -Wall -Werror")
68

79
set(EXECUTABLE_OUTPUT_PATH build)
8-
set(HEADER_FILES src/map.h src/map.c)
10+
set(HEADER_FILES
11+
src/map.h
12+
src/map.c
13+
src/minibench.h
14+
src/ministat.h
15+
)
916

1017
add_executable(
1118
map

map/src/main.c

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "map.c"
99
#include "map.h"
10+
#include "minibench.h"
1011

1112
void swap(int *x, int *y)
1213
{
@@ -17,9 +18,10 @@ void swap(int *x, int *y)
1718

1819
enum { NNODES = 1000 * 1000 };
1920

21+
#if 0
2022
int main()
2123
{
22-
printf("===== Self benchmark: map =====\n");
24+
printf("--- Self benchmark: map ---\n");
2325

2426
map_t tree = map_init(int, int, map_cmp_int);
2527

@@ -75,3 +77,42 @@ int main()
7577

7678
return 0;
7779
}
80+
#endif
81+
82+
BENCHMARK(
83+
3,
84+
85+
map_t tree = map_init(int, int, map_cmp_int);
86+
87+
int key[NNODES];
88+
int val[NNODES];
89+
90+
/*
91+
* Generate data for insertion
92+
*/
93+
for (int i = 0; i < NNODES; i++) {
94+
key[i] = i;
95+
val[i] = i;
96+
}
97+
98+
/* This is not a reconmended way to randomize stuff, just a simple test */
99+
/* I know MT19937 might be better */
100+
srand((unsigned) time(NULL));
101+
for (int i = 0; i < 1e7; i++) {
102+
int pos_a = rand() % NNODES;
103+
int pos_b = rand() % NNODES;
104+
swap(&key[pos_a], &key[pos_b]);
105+
swap(&val[pos_a], &val[pos_b]);
106+
}
107+
108+
TIMED(
109+
"map_insert",
110+
for (int i = 0; i < NNODES;
111+
i++) { map_insert(tree, key + i, val + i); });
112+
TIMED(
113+
"map_search", map_iter_t my_it;
114+
for (int i = 0; i < NNODES; i++) { map_find(tree, &my_it, key + i); });
115+
116+
/* There will be a funny behavior with delete */
117+
// TIMED("map_delete", map_delete(tree););
118+
)

map/src/minibench.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <time.h>
4+
#include <sys/time.h>
5+
#include <sys/utsname.h>
6+
7+
#include "ministat.h"
8+
9+
10+
#define BENCHMARK(iters, ...) int main(int argc, char *argv[]) { \
11+
struct timespec res; \
12+
clock_getres(CLOCK_MONOTONIC, &res); \
13+
struct utsname name; \
14+
uname(&name); \
15+
int N = iters; \
16+
int MAX_TESTS = 7; \
17+
int tests = -1; \
18+
printf("\n===== Running microbench =====\n"); \
19+
printf("* system: %s %s %s\n", name.sysname, \
20+
name.release, name.machine); \
21+
printf("* resolution: %luns \n", res.tv_nsec); \
22+
printf("* iterations: %u \n", N); \
23+
printf("------------------------------\n"); \
24+
printf("======= Ministat report ======\n"); \
25+
double results[MAX_TESTS][N]; \
26+
const char *names[MAX_TESTS]; \
27+
__VA_ARGS__ \
28+
ministat(2, tests+1, N, results, names); \
29+
return 0; \
30+
}
31+
32+
#define TIMED(name, ...) \
33+
{ \
34+
tests += 1; \
35+
struct timespec before; \
36+
struct timespec after; \
37+
names[tests] = name; \
38+
for (int i=0; i<N; i++) { \
39+
clock_gettime(CLOCK_MONOTONIC, &before); \
40+
__VA_ARGS__ \
41+
clock_gettime(CLOCK_MONOTONIC, &after); \
42+
results[tests][i] = \
43+
(after.tv_sec - before.tv_sec)*1000000000UL \
44+
+ (after.tv_nsec - before.tv_nsec); \
45+
} \
46+
}

0 commit comments

Comments
 (0)