libzahl

big integer library
git clone git://git.suckless.org/libzahl
Log | Files | Refs | README | LICENSE

commit c018cebc38c37370ab6c89d19694587edf7d0d0e
parent c1b7101b0f33b07c98b971b2dd075c068f319299
Author: Mattias Andrée <maandree@kth.se>
Date:   Wed,  9 Mar 2016 19:12:57 +0100

Add simple benchmarker

Signed-off-by: Mattias Andrée <maandree@kth.se>

Diffstat:
M.gitignore | 1+
MMakefile | 3+++
Abench/benchmark.c | 132+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 136 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -5,3 +5,4 @@ *.so /test /test-random.c +/benchmark diff --git a/Makefile b/Makefile @@ -82,6 +82,9 @@ test-random.c: test-generate.py test: test.c libzahl.a test-random.c $(CC) $(LDFLAGS) $(CFLAGS) $(CPPFLAGS) -o $@ test.c libzahl.a +benchmark: bench/benchmark.c libzahl.a + $(CC) $(LDFLAGS) $(CFLAGS) $(CPPFLAGS) -o $@ $^ + check: test ./test diff --git a/bench/benchmark.c b/bench/benchmark.c @@ -0,0 +1,132 @@ +#include <time.h> +#include <stdio.h> + +#include "../zahl.h" + + +#ifndef CLOCK_MONOTONIC_RAW +# define CLOCK_MONOTONIC_RAW CLOCK_MONOTONIC +#endif + + +#define BENCHMARK(INSTRUCTION, FAST)\ + do {\ + i = FAST ? 1000000L : 1000L;\ + clock_gettime(CLOCK_MONOTONIC_RAW, &start);\ + while (i--) {\ + INSTRUCTION;\ + }\ + clock_gettime(CLOCK_MONOTONIC_RAW, &end);\ + end.tv_sec -= start.tv_sec;\ + end.tv_nsec -= start.tv_nsec;\ + if (end.tv_nsec < 0) {\ + end.tv_nsec += 1000000000L;\ + end.tv_sec -= 1;\ + }\ + printf("%s: %lli.%09li %s (152 bits)\n",\ + #INSTRUCTION,\ + (long long int)(end.tv_sec), end.tv_nsec,\ + FAST ? "µs" : "ms");\ + } while (0) + + +int +main(int argc, char *argv[]) +{ + struct timespec start, end; + char buf[1000]; + z_t a, b, c, d, tiny; + jmp_buf jmp; + size_t i; + + if (setjmp(jmp)) { + zperror(argv[0]); + return 1; + } + zsetup(jmp); + zinit(a); + zinit(b); + zinit(c); + zinit(d); + zinit(tiny); + + zsets(a, "5495468234592964023447280368442884381000481887"); + zsets(b, "4781084818570683458641843084358135840548636081"); + zsets(tiny, "5"); + + BENCHMARK(zset(c, a), 1); + BENCHMARK(zseti(c, 1000000000LL), 1); + BENCHMARK(zsetu(c, 1000000000ULL), 1); + BENCHMARK(zneg(c, a), 1); + BENCHMARK(zneg(a, a), 1); + BENCHMARK(zabs(c, a), 1); + BENCHMARK(zabs(a, a), 1); + BENCHMARK(zadd_unsigned(c, a, b), 1); + BENCHMARK(zsub_unsigned(c, a, b), 1); + BENCHMARK(zadd(c, a, b), 1); + BENCHMARK(zsub(c, a, b), 1); + BENCHMARK(zand(c, a, b), 1); + BENCHMARK(zor(c, a, b), 1); + BENCHMARK(zxor(c, a, b), 1); + BENCHMARK(znot(c, a), 1); + BENCHMARK(zeven(a), 1); + BENCHMARK(zodd(a), 1); + BENCHMARK(zeven_nonzero(a), 1); + BENCHMARK(zodd_nonzero(a), 1); + BENCHMARK(zzero(a), 1); + BENCHMARK(zsignum(a), 1); + BENCHMARK(zbits(a), 1); + BENCHMARK(zlsb(a), 1); + BENCHMARK(zswap(a, b), 1); + BENCHMARK(zlsh(c, a, 76), 1); + BENCHMARK(zrsh(c, a, 76), 1); + BENCHMARK(ztrunc(c, a, 76), 1); + BENCHMARK(zsplit(c, d, a, 76), 1); + BENCHMARK(zcmpmag(a, b), 1); + BENCHMARK(zcmp(a, b), 1); + BENCHMARK(zcmpi(a, 1000000000LL), 1); + BENCHMARK(zcmpu(a, 1000000000ULL), 1); + BENCHMARK(zbset(c, a, 76, 1), 1); + BENCHMARK(zbset(c, a, 76, 0), 1); + BENCHMARK(zbset(c, a, 76, -1), 1); + BENCHMARK(zbtest(a, 76), 1); + BENCHMARK(zgcd(c, a, b), 0); + BENCHMARK(zmul(c, a, b), 0); + BENCHMARK(zmul(c, a, a), 0); + BENCHMARK(zsqr(c, a), 0); + zsets(d, "1484298084218938358480511181388394862858002249"); + BENCHMARK(zmodmul(c, a, b, d), 0); + BENCHMARK(zmodmul(c, a, a, d), 0); + BENCHMARK(zmodsqr(c, a, d), 0); + BENCHMARK(zmodmul(c, a, b, tiny), 0); + BENCHMARK(zmodmul(c, a, a, tiny), 0); + BENCHMARK(zmodsqr(c, a, tiny), 0); + zsets(d, "12"); + BENCHMARK(zpow(c, a, d), 0); + BENCHMARK(zpowu(c, a, 12), 0); + BENCHMARK(zmodpow(c, a, d, b), 0); + BENCHMARK(zmodpowu(c, a, 12, b), 0); + BENCHMARK(zsets(c, "5495468234592964023447280368442884381000481887"), 0); + BENCHMARK(zstr_length(a, 10), 0); + BENCHMARK(zstr(a, buf), 0); + BENCHMARK(zrand(c, FAST_RANDOM, QUASIUNIFORM, a), 0); + BENCHMARK(zrand(c, FAST_RANDOM, UNIFORM, a), 0); + BENCHMARK(zptest(d, a, 5), 0); + BENCHMARK(zsave(a, buf), 1); + BENCHMARK(zload(a, buf), 1); + BENCHMARK(zdiv(c, a, b), 1); + BENCHMARK(zmod(c, a, b), 1); + BENCHMARK(zdivmod(c, d, a, b), 1); + BENCHMARK(zdiv(c, a, tiny), 0); + BENCHMARK(zmod(c, a, tiny), 0); + BENCHMARK(zdivmod(c, d, a, tiny), 0); + + zfree(a); + zfree(b); + zfree(c); + zfree(d); + zfree(tiny); + zunsetup(); + return 0; + (void) argc; +}