From dd775090878854ccfe65310f9457ce3e393c070d Mon Sep 17 00:00:00 2001 From: Vladimir Azarov Date: Mon, 18 Aug 2025 03:59:02 +0200 Subject: Benchmark files --- test/benchmarks/search-rabin-karp.c | 81 +++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 test/benchmarks/search-rabin-karp.c (limited to 'test/benchmarks/search-rabin-karp.c') diff --git a/test/benchmarks/search-rabin-karp.c b/test/benchmarks/search-rabin-karp.c new file mode 100644 index 0000000..d9860ee --- /dev/null +++ b/test/benchmarks/search-rabin-karp.c @@ -0,0 +1,81 @@ +struct result_buf { + unsigned long array[24*1024*1024]; + int len; +}; + +struct result_buf rbuf; + +int read(int fd, void *buf, unsigned long len); +void *malloc(unsigned long); +long strlen(char *); +int open(char *, int flags, long mode); +int printf(char *, ...); +void exit(int); +int strncmp(char *, char *, unsigned long); + +void rabin_karp(char *p, int plen, char *t, int tlen) +{ + unsigned long d = 129; + unsigned long h = 1, p_h = 0, t_h = 0; + int i; + for (i = 0; i < plen - 1; ++i) + h = (h * d); + + for (i = 0; i < plen; ++i) { + p_h = (d*p_h + p[i]); + t_h = (d*t_h + t[i]); + } + + + for (i = 0; i <= tlen - plen; ++i) { + + if (p_h == t_h && strncmp(t + i, p, plen) == 0) { + rbuf.array[rbuf.len] = i; + ++rbuf.len; + } + if (i < tlen - plen) { + t_h = (d*(t_h - t[i]*h)) + t[i + plen]; + } + } +} + +void *read_file(int fd, int *len) +{ + int size = 1500 * 1024 * 1024; + unsigned char *arr = malloc(size); + int i; + for (i = 0; ;) { + int rd = read(fd, arr + i, size - i); + if (rd < 0) + exit(2); + if (rd == 0) + break; + i += rd; + } + + *len = i; + return arr; +} + +int main(int argc, char **argv) +{ + int i, slen; + long sum = 0; + int fd; + char *buf; + char *needle = argv[2]; + + fd = open(argv[1], 0, 0); + if (fd == -1) + return 1; + buf = read_file(fd, &slen); + printf("len: %d\n", slen); + + rabin_karp(needle, strlen(needle), buf, slen); + + for (i = 0; i < rbuf.len; ++i) + sum += rbuf.array[i]; + printf("%ld\n", sum); + + return 0; +} -- cgit v1.2.3