aboutsummaryrefslogtreecommitdiff
path: root/examples/bench.c
diff options
context:
space:
mode:
authorTadas Vilkeliskis <vilkeliskis.t@gmail.com>2026-06-11 10:27:10 -0400
committerTadas Vilkeliskis <vilkeliskis.t@gmail.com>2026-06-11 10:27:10 -0400
commit49553727accabf4318aba941fa6cb45d37d95d5f (patch)
treeaac6cd8d7a3b6185218999c35bf46e04cd994e5f /examples/bench.c
parente5e4664b043a90d2872035aa23e8853ee54c23ef (diff)
examples: add benchmark utility
Diffstat (limited to 'examples/bench.c')
-rw-r--r--examples/bench.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/examples/bench.c b/examples/bench.c
new file mode 100644
index 0000000..30b61c4
--- /dev/null
+++ b/examples/bench.c
@@ -0,0 +1,86 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <csv_parser.h>
+
+int noop_field_cb(csv_parser_t *parser, const char *data, size_t length, int row, int col)
+{
+ return 0; // Do nothing, we only want to benchmark the parser, not allocation overhead
+}
+
+int main(int argc, const char *argv[])
+{
+ if (argc < 2) {
+ fprintf(stderr, "Usage: %s <csv_file> [iterations]\n", argv[0]);
+ return 1;
+ }
+
+ const char *filename = argv[1];
+ int iterations = 1000;
+ if (argc >= 3) {
+ iterations = atoi(argv[2]);
+ }
+
+ int fd = open(filename, O_RDONLY);
+ if (fd == -1) {
+ perror("open");
+ return 1;
+ }
+
+ struct stat st;
+ if (fstat(fd, &st) == -1) {
+ perror("fstat");
+ close(fd);
+ return 1;
+ }
+
+ size_t file_size = st.st_size;
+ char *buffer = malloc(file_size + 1);
+ if (!buffer) {
+ perror("malloc");
+ close(fd);
+ return 1;
+ }
+
+ ssize_t nread = read(fd, buffer, file_size);
+ if (nread != file_size) {
+ perror("read");
+ free(buffer);
+ close(fd);
+ return 1;
+ }
+ close(fd);
+
+ csv_parser_t parser;
+ csv_parser_settings_t settings;
+ settings.delimiter = ',';
+ settings.field_cb = noop_field_cb;
+
+ printf("Benchmarking %s (%.2f MB) for %d iterations...\n", filename, (double)file_size / (1024 * 1024), iterations);
+
+ struct timespec start, end;
+ clock_gettime(CLOCK_MONOTONIC, &start);
+
+ for (int i = 0; i < iterations; i++) {
+ csv_parser_init(&parser);
+ csv_parser_execute(&parser, &settings, buffer, file_size);
+ csv_parser_finish(&parser, &settings);
+ }
+
+ clock_gettime(CLOCK_MONOTONIC, &end);
+
+ free(buffer);
+
+ double elapsed = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1e9;
+ double total_bytes = (double)file_size * iterations;
+ double mb_per_sec = (total_bytes / (1024 * 1024)) / elapsed;
+
+ printf("Time elapsed: %.3f seconds\n", elapsed);
+ printf("Throughput: %.2f MB/s\n", mb_per_sec);
+
+ return 0;
+}