Test reading with and without malloc

This commit is contained in:
Abdelrahman Said 2023-09-10 00:39:49 +01:00
parent 4b905a56a5
commit 3a0917ed58
3 changed files with 78 additions and 14 deletions

View File

@ -33,12 +33,24 @@ struct reptester {
reptest_results results; reptest_results results;
}; };
struct reptest_func { enum alloc_type {
const char *name; ALLOC_TYPE_WITHOUT_MALLOC,
void (*func)(reptester *tester); ALLOC_TYPE_WITH_MALLOC,
COUNT_ALLOC_TYPE,
}; };
void run_func_test(reptester *tester, reptest_func func_obj); typedef void (*reptest_func)(reptester *tester, alloc_type type);
struct func_data {
const char *names[COUNT_ALLOC_TYPE];
reptest_func func;
};
void handle_alloc(reptester *tester, alloc_type type);
void handle_free(reptester *tester, alloc_type type);
void run_func_test(reptester *tester, reptest_func func, const char *func_name,
alloc_type type);
void print_results(reptester *tester, const char *name); void print_results(reptester *tester, const char *name);
#endif // !REPTESTER_H #endif // !REPTESTER_H

View File

@ -9,8 +9,8 @@
#define ARR_LEN(ARR) sizeof(ARR) / sizeof(*ARR) #define ARR_LEN(ARR) sizeof(ARR) / sizeof(*ARR)
void test_fread(reptester *tester); void test_fread(reptester *tester, alloc_type type);
void test_read(reptester *tester); void test_read(reptester *tester, alloc_type type);
u64 get_file_length(FILE *fp); u64 get_file_length(FILE *fp);
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
@ -53,7 +53,8 @@ int main(int argc, char *argv[]) {
return -1; return -1;
} }
reptest_func funcs[] = {{"FREAD", test_fread}, {"READ", test_read}}; func_data funcs[] = {{{"READ", "READ WITH MALLOC"}, test_read},
{{"FREAD", "FREAD WITH MALLOC"}, test_fread}};
tester.params.read_size = get_file_length(fp); tester.params.read_size = get_file_length(fp);
tester.params.read_count = 1; tester.params.read_count = 1;
@ -62,7 +63,9 @@ int main(int argc, char *argv[]) {
for (u64 i = 0; i < waves; ++i) { for (u64 i = 0; i < waves; ++i) {
for (u64 j = 0; j < ARR_LEN(funcs); ++j) { for (u64 j = 0; j < ARR_LEN(funcs); ++j) {
run_func_test(&tester, funcs[j]); for (u64 k = 0; k < COUNT_ALLOC_TYPE; ++k) {
run_func_test(&tester, funcs[j].func, funcs[j].names[k], (alloc_type)k);
}
} }
} }
@ -73,12 +76,14 @@ int main(int argc, char *argv[]) {
return 0; return 0;
} }
void test_fread(reptester *tester) { void test_fread(reptester *tester, alloc_type type) {
FILE *fp = fopen(tester->params.filename, "rb"); FILE *fp = fopen(tester->params.filename, "rb");
if (!fp) { if (!fp) {
return; return;
} }
handle_alloc(tester, type);
u64 start = read_cpu_timer(); u64 start = read_cpu_timer();
u64 obj_count = fread(tester->params.buffer, tester->params.read_size, u64 obj_count = fread(tester->params.buffer, tester->params.read_size,
tester->params.read_count, fp); tester->params.read_count, fp);
@ -93,15 +98,19 @@ void test_fread(reptester *tester) {
read_time, read_time,
}; };
handle_free(tester, type);
fclose(fp); fclose(fp);
} }
void test_read(reptester *tester) { void test_read(reptester *tester, alloc_type type) {
FILE *fp = fopen(tester->params.filename, "rb"); FILE *fp = fopen(tester->params.filename, "rb");
if (!fp) { if (!fp) {
return; return;
} }
handle_alloc(tester, type);
i32 fd = fileno(fp); i32 fd = fileno(fp);
u64 start = read_cpu_timer(); u64 start = read_cpu_timer();
@ -116,6 +125,8 @@ void test_read(reptester *tester) {
read_time, read_time,
}; };
handle_free(tester, type);
fclose(fp); fclose(fp);
} }

View File

@ -1,8 +1,39 @@
#include "repetition_testing/reptester.h" #include "repetition_testing/reptester.h"
#include "profiler/timer.h" #include "profiler/timer.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h>
void run_func_test(reptester *tester, reptest_func func_obj) { void handle_alloc(reptester *tester, alloc_type type) {
switch (type) {
case ALLOC_TYPE_WITH_MALLOC:
if (!(tester->params.buffer)) {
tester->params.buffer = (char *)malloc(tester->params.read_size + 1);
memset(tester->params.buffer, 0, tester->params.read_size + 1);
}
break;
default:
break;
}
}
void handle_free(reptester *tester, alloc_type type) {
switch (type) {
case ALLOC_TYPE_WITH_MALLOC:
if (tester->params.buffer) {
free(tester->params.buffer);
tester->params.buffer = NULL;
}
break;
default:
break;
}
}
void run_func_test(reptester *tester, reptest_func func, const char *func_name,
alloc_type type) {
tester->test_start_time = read_cpu_timer(); tester->test_start_time = read_cpu_timer();
tester->test_time_secs = 0.0; tester->test_time_secs = 0.0;
tester->current_run = 1; tester->current_run = 1;
@ -12,8 +43,13 @@ void run_func_test(reptester *tester, reptest_func func_obj) {
tester->total = 0; tester->total = 0;
tester->results = {}; tester->results = {};
if (type == ALLOC_TYPE_WITHOUT_MALLOC && !(tester->params.buffer)) {
tester->params.buffer = (char *)malloc(tester->params.read_size + 1);
memset(tester->params.buffer, 0, tester->params.read_size + 1);
}
while (tester->test_time_secs <= tester->wait_time_secs) { while (tester->test_time_secs <= tester->wait_time_secs) {
func_obj.func(tester); func(tester, type);
if (tester->results.bytes_read < if (tester->results.bytes_read <
tester->params.read_size * tester->params.read_count) { tester->params.read_size * tester->params.read_count) {
@ -39,7 +75,12 @@ void run_func_test(reptester *tester, reptest_func func_obj) {
++(tester->current_run); ++(tester->current_run);
} }
print_results(tester, func_obj.name); if (type == ALLOC_TYPE_WITHOUT_MALLOC && tester->params.buffer) {
free(tester->params.buffer);
tester->params.buffer = NULL;
}
print_results(tester, func_name);
} }
void print_results(reptester *tester, const char *name) { void print_results(reptester *tester, const char *name) {