Skip to content

Commit

Permalink
test: moved tear-up and tear-down support from test case to test suit…
Browse files Browse the repository at this point in the history
… level
  • Loading branch information
scokmen committed Aug 2, 2024
1 parent c479320 commit 3bcb3b1
Show file tree
Hide file tree
Showing 12 changed files with 239 additions and 242 deletions.
51 changes: 27 additions & 24 deletions benchmark/dlist_bench.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ typedef struct {
int val;
} list_data;

const int NUMBER_OF_ITERATION = 3;
const int NUMBER_OF_RAND_ACCESS = 1000;

static list_data *list_data_new(int range) {
list_data *data = malloc(sizeof(list_data));
if (data == NULL) {
Expand All @@ -23,13 +26,13 @@ static int comparator(void* given, void* data) {
return (*(int*)given) - ((list_data*)data)->val;
}

static void run_dlist_bench(int data_range, int num_of_insert, int num_of_iteration, int num_of_random_access) {
static void run_dlist_bench(int data_range, int num_of_insert) {
int j;
void *data;
sn_dlist_t dlist;
sn_dlist_init(&dlist, data_destructor);

for (int iteration = 0; iteration < num_of_iteration; iteration++) {
for (int iteration = 0; iteration < NUMBER_OF_ITERATION; iteration++) {
list_data **list_items = NULL;

// Random Insert
Expand All @@ -53,13 +56,13 @@ static void run_dlist_bench(int data_range, int num_of_insert, int num_of_iterat
sn_dlist_collect(&dlist, (void **) list_items, dlist.size);

// Random Search & Get
for (int i = 0; i < num_of_random_access; i++) {
for (int i = 0; i < NUMBER_OF_RAND_ACCESS; i++) {
int key = rand() % data_range;
sn_dlist_has(&dlist, &key, comparator);
}

// Random Search & Delete
for (int i = 0; i < num_of_random_access; i++) {
for (int i = 0; i < NUMBER_OF_RAND_ACCESS; i++) {
int key = rand() % data_range;
sn_dlist_del(&dlist, &key, comparator);
}
Expand Down Expand Up @@ -89,26 +92,26 @@ static void run_dlist_bench(int data_range, int num_of_insert, int num_of_iterat
int main() {
srand(time(NULL));

run_dlist_bench(16, 16, 3, 1000);
run_dlist_bench(16, 256, 3, 1000);
run_dlist_bench(16, 1024, 3, 1000);
run_dlist_bench(16, 4096, 3, 1000);
run_dlist_bench(64, 16, 3, 1000);
run_dlist_bench(64, 256, 3, 1000);
run_dlist_bench(64, 1024, 3, 1000);
run_dlist_bench(64, 4096, 3, 1000);
run_dlist_bench(256, 16, 3, 1000);
run_dlist_bench(256, 256, 3, 1000);
run_dlist_bench(256, 1024, 3, 1000);
run_dlist_bench(256, 4096, 3, 1000);
run_dlist_bench(1024, 16, 3, 1000);
run_dlist_bench(1024, 256, 3, 1000);
run_dlist_bench(1024, 1024, 3, 1000);
run_dlist_bench(1024, 4096, 3, 1000);
run_dlist_bench(4096, 16, 3, 1000);
run_dlist_bench(4096, 256, 3, 1000);
run_dlist_bench(4096, 1024, 3, 1000);
run_dlist_bench(4096, 4096, 3, 1000);
run_dlist_bench(16, 16);
run_dlist_bench(16, 256);
run_dlist_bench(16, 1024);
run_dlist_bench(16, 4096);
run_dlist_bench(64, 16);
run_dlist_bench(64, 256);
run_dlist_bench(64, 1024);
run_dlist_bench(64, 4096);
run_dlist_bench(256, 16);
run_dlist_bench(256, 256);
run_dlist_bench(256, 1024);
run_dlist_bench(256, 4096);
run_dlist_bench(1024, 16);
run_dlist_bench(1024, 256);
run_dlist_bench(1024, 1024);
run_dlist_bench(1024, 4096);
run_dlist_bench(4096, 16);
run_dlist_bench(4096, 256);
run_dlist_bench(4096, 1024);
run_dlist_bench(4096, 4096);

exit(EXIT_SUCCESS);
}
56 changes: 30 additions & 26 deletions benchmark/map_bench.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ typedef struct {
int val;
} map_data;

const int NUMBER_OF_ITERATION = 3;
const int NUMBER_OF_RAND_ACCESS = 1000;
const int NUMBER_OF_KEYS = 4096;

static map_data *new_map_data() {
map_data * data = malloc(sizeof (map_data));
data->val = 1;
Expand All @@ -32,17 +36,17 @@ static const char *generate_key(int length) {
return str;
}

static const char* pick_key(const char** keys, int count) {
return keys[rand() % count];
static const char *pick_key(const char **keys) {
return keys[rand() % NUMBER_OF_KEYS];
}

static void run_map_bench(int16_t bucket_size, int count, int key_length, int num_of_iteration, int num_of_random_access) {
static void run_map_bench(int16_t bucket_size, int key_length) {
sn_map_t map;
const char** keys = calloc(count, sizeof (char*));
const char** keys = calloc(NUMBER_OF_KEYS, sizeof (char*));
if (keys == NULL) {
exit(EXIT_FAILURE);
}
for (int i = 0; i < count; i++) {
for (int i = 0; i < NUMBER_OF_KEYS; i++) {
keys[i] = generate_key(key_length);
if (keys[i] == NULL) {
exit(EXIT_FAILURE);
Expand All @@ -53,16 +57,16 @@ static void run_map_bench(int16_t bucket_size, int count, int key_length, int nu
exit(EXIT_FAILURE);
}

for (int i = 0; i < count; i++) {
for (int i = 0; i < 4096; i++) {
if (sn_map_set(&map, keys[i], new_map_data())) {
exit(EXIT_FAILURE);
}
}

for (int iteration = 0; iteration < num_of_iteration; iteration++) {
for (int iteration = 0; iteration < NUMBER_OF_ITERATION; iteration++) {
// Random Access
for (int i = 0; i < num_of_random_access; i++) {
const char* key = pick_key(keys, count);
for (int i = 0; i < NUMBER_OF_RAND_ACCESS; i++) {
const char* key = pick_key(keys);
if (sn_map_has(&map, key)) {
void* data = sn_map_get(&map, key);
if ((*(int*)data) != 1) {
Expand All @@ -72,21 +76,21 @@ static void run_map_bench(int16_t bucket_size, int count, int key_length, int nu
}

// Random Overwrite
for (int i = 0; i < num_of_random_access; i++) {
const char* key = pick_key(keys, count);
for (int i = 0; i < NUMBER_OF_RAND_ACCESS; i++) {
const char* key = pick_key(keys);
if (sn_map_set(&map, key, new_map_data())) {
exit(EXIT_FAILURE);
}
}

// Random Delete
for (int i = 0; i < 10000; i++) {
const char* key = pick_key(keys, count);
for (int i = 0; i < NUMBER_OF_RAND_ACCESS; i++) {
const char* key = pick_key(keys);
sn_map_del(&map, key);
}
}

for (int i = 0; i < count; i++) {
for (int i = 0; i < 4096; i++) {
free((char*)keys[i]);
}

Expand All @@ -97,18 +101,18 @@ static void run_map_bench(int16_t bucket_size, int count, int key_length, int nu
int main() {
srand(time(NULL));

run_map_bench(1024, 4096, 8, 3, 1000);
run_map_bench(1024, 4096, 2, 3, 1000);
run_map_bench(1024, 4096, 1, 3, 1000);
run_map_bench(128, 4096, 8, 3, 1000);
run_map_bench(128, 4096, 2, 3, 1000);
run_map_bench(128, 4096, 1, 3, 1000);
run_map_bench(16, 4096, 8, 3, 1000);
run_map_bench(16, 4096, 2, 3, 1000);
run_map_bench(16, 4096, 1, 3, 1000);
run_map_bench(4, 4096, 8, 3, 1000);
run_map_bench(4, 4096, 2, 3, 1000);
run_map_bench(4, 4096, 1, 3, 1000);
run_map_bench(1024, 8);
run_map_bench(1024, 2);
run_map_bench(1024, 1);
run_map_bench(128, 8);
run_map_bench(128, 2);
run_map_bench(128, 1);
run_map_bench(16, 8);
run_map_bench(16, 2);
run_map_bench(16, 1);
run_map_bench(4, 8);
run_map_bench(4, 2);
run_map_bench(4, 1);

exit(EXIT_SUCCESS);
}
32 changes: 17 additions & 15 deletions include/headers/router.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,37 +11,39 @@ typedef enum {
SN_ROUTE_GROUP
} sn_handler_type;

typedef struct {
sn_map_t context;
} sn_route_ctx_t;
typedef struct sn_http_req_s sn_http_req_t;
typedef struct sn_http_res_s sn_http_res_t;
typedef struct sn_handler_s sn_handler_t;
typedef struct sn_route_handler_s sn_route_handler_t;
typedef struct sn_route_group_s sn_route_group_t;

typedef struct {
typedef sn_http_res_t *(*sn_req_handler)(sn_http_req_t *req);

struct sn_http_req_s {
const char *path;
sn_map_t headers;
sn_map_t queries;
sn_map_t params;
} sn_http_req_t;
};

typedef struct {
struct sn_http_res_s {
sn_map_t headers;
} sn_http_res_t;

typedef sn_http_res_t *(*sn_req_handler)(sn_http_req_t *req, sn_route_ctx_t *ctx);
};

typedef struct {
struct sn_handler_s {
HANDLER_PROPS
} sn_handler_t;
};

typedef struct {
struct sn_route_handler_s {
HANDLER_PROPS
sn_http_method_t method;
sn_req_handler action;
} sn_route_handler_t;
};

typedef struct {
struct sn_route_group_s {
HANDLER_PROPS
sn_dlist_t routes;
} sn_route_group_t;
};

SN_NONNULL(1, 3, 4)
void sn_route_handler_init(sn_route_handler_t *route_handler, sn_http_method_t method, const char *path, sn_req_handler handler);
Expand Down
31 changes: 17 additions & 14 deletions include/headers/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,31 @@
#include <stdint.h>
#include <stddef.h>

typedef struct sn_dlist_s sn_dlist_t;
typedef struct sn_map_s sn_map_t;

typedef void (*sn_data_destructor)(void *data);
typedef int (*sn_comparator) (void *given, void *data);
typedef void (*sn_map_destructor) (const char *key, void *data);

typedef struct sn_dlist_node_t {
struct sn_dlist_node_s {
void *data;
struct sn_dlist_node_t *next;
struct sn_dlist_node_t *prev;
} sn_dlist_node_t;
struct sn_dlist_node_s *next;
struct sn_dlist_node_s *prev;
};

typedef struct {
struct sn_dlist_s {
size_t size;
sn_dlist_node_t *head;
sn_dlist_node_t *tail;
struct sn_dlist_node_s *head;
struct sn_dlist_node_s *tail;
sn_data_destructor destructor;
} sn_dlist_t;
};

struct sn_map_s {
uint16_t bucket_size;
sn_dlist_t *buckets;
sn_map_destructor destructor;
};

SN_NONNULL(1)
void sn_dlist_init(sn_dlist_t *list, sn_data_destructor destructor);
Expand Down Expand Up @@ -61,12 +70,6 @@ void sn_dlist_collect(sn_dlist_t *list, void **items, size_t limit);
SN_NONNULL(1)
void sn_dlist_destroy(sn_dlist_t *list);

typedef struct {
uint16_t bucket_size;
sn_dlist_t *buckets;
sn_map_destructor destructor;
} sn_map_t;

SN_NONNULL(1)
int sn_map_init(sn_map_t *map, uint16_t bucket_size, sn_map_destructor destructor);

Expand Down
4 changes: 2 additions & 2 deletions reports/hyperfine_reports.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# hyperfine --warmup 10 --runs 100 ./map_bench

Benchmark 1: ./map_bench
Time (mean ± σ): 87.4 ms ± 13.5 ms [User: 79.6 ms, System: 1.6 ms]
Range (min … max): 79.1 ms … 176.8 ms 100 runs
Time (mean ± σ): 71.9 ms ± 1.0 ms [User: 67.4 ms, System: 1.3 ms]
Range (min … max): 69.8 ms … 75.1 ms 100 runs

# hyperfine --warmup 10 --runs 100 ./dlist_bench

Expand Down
Loading

0 comments on commit 3bcb3b1

Please sign in to comment.