diff --git a/Makefile b/Makefile index da527bd..8ea7b2c 100644 --- a/Makefile +++ b/Makefile @@ -51,7 +51,7 @@ $(OBJ_DIR): mkdir -p $(OBJ_DIR) # Benchmark rules -$(BENCH_TARGET): $(BENCH_OBJ_DIR)/bench.o $(BENCH_OBJ_DIR)/vector.o $(BENCH_OBJ_DIR)/map.o $(BENCH_OBJ_DIR)/bigint.o +$(BENCH_TARGET): $(BENCH_OBJ_DIR)/bench.o $(BENCH_OBJ_DIR)/vector.o $(BENCH_OBJ_DIR)/map.o $(BENCH_OBJ_DIR)/bigint.o $(BENCH_OBJ_DIR)/string.o $(CC) $(BENCH_FLAGS) -o $@ $^ $(BENCH_OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(BENCH_OBJ_DIR) diff --git a/README.md b/README.md index 3544300..6391f41 100644 --- a/README.md +++ b/README.md @@ -187,14 +187,16 @@ $ ./test_bigint ``` ## Benchmark -Under the [`benchmark/`](/benchmark/) folder, you can find a simple benchmark program that stress the `Vector` and the `Map` data structures. You can run it by issuing the following command: +Under the [`benchmark/`](/benchmark/) folder, you can find a very simple benchmark program that stress the data structures. +You can run it by issuing the following command: ```sh $ make clean all CC=clang $ ./benchmark_datum -omputing Vector average time...average time: 8 ms -Computing Map average time...average time: 53 ms -Computing BigInt average time...average time: 76 ms +Computing Vector average time...average time: 6 ms +Computing Map average time...average time: 49 ms +Computing BigInt average time...average time: 67 ms +Computing String average time...average time: 13 ms ``` diff --git a/benchmark/benchmark.c b/benchmark/benchmark.c index f083ca1..6bf1746 100644 --- a/benchmark/benchmark.c +++ b/benchmark/benchmark.c @@ -7,6 +7,7 @@ #include "../src/vector.h" #include "../src/map.h" #include "../src/bigint.h" +#include "../src/string.h" typedef void (*test_fn_t)(size_t iterations); @@ -116,6 +117,31 @@ void test_bigint(size_t iterations) { } } +void test_string(size_t iterations) { + volatile size_t total_len = 0; + + for (size_t idx = 0; idx < iterations; idx++) { + string_t *str1 = string_new("hello").value.string; + string_t *str2 = string_new(" World").value.string; + + string_result_t concat = string_concat(str1, str2); + string_result_t upper = string_to_upper(concat.value.string); + total_len += string_size(upper.value.string); + string_result_t needle = string_new("WORLD"); + string_result_t contains = string_contains(upper.value.string, needle.value.string); + + if (contains.value.idx >= 0) { + total_len += contains.value.idx; + } + + string_destroy(str1); + string_destroy(str2); + string_destroy(concat.value.string); + string_destroy(upper.value.string); + string_destroy(needle.value.string); + } +} + static inline uint64_t now_ns(void) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); @@ -155,5 +181,9 @@ int main(void) { fflush(stdout); printf("average time: %lld ms\n", benchmark(test_bigint, 1e5, 30)); + printf("Computing String average time..."); + fflush(stdout); + printf("average time: %lld ms\n", benchmark(test_string, 1e5, 30)); + return 0; }