benchmark.c - libzahl - big integer library
HTML git clone git://git.suckless.org/libzahl
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
benchmark.c (3504B)
---
1 #include "util.h"
2
3
4 #define BENCHMARK(INSTRUCTION, FAST)\
5 do {\
6 i = FAST ? 1000000L : 1000L;\
7 TIC;\
8 while (i--) {\
9 (void)INSTRUCTION;\
10 }\
11 TOC;\
12 printf("%s: %s %s (152 bits)\n",\
13 #INSTRUCTION, STIME, FAST ? "µs" : "ms");\
14 } while (0)
15
16
17 int
18 main(int argc, char *argv[])
19 {
20 char buf[2000];
21 z_t a, b, c, d, tiny;
22 jmp_buf jmp;
23 size_t i;
24
25 benchmark_init();
26
27 if (setjmp(jmp)) {
28 zperror(argv[0]);
29 return 1;
30 }
31 zsetup(jmp);
32 zinit(a);
33 zinit(b);
34 zinit(c);
35 zinit(d);
36 zinit(tiny);
37
38 zsets(a, "5495468234592964023447280368442884381000481887");
39 zsets(b, "4781084818570683458641843084358135840548636081");
40 zsets(tiny, "5");
41
42 BENCHMARK(zset(c, a), 1);
43 BENCHMARK(zseti(c, 1000000000LL), 1);
44 BENCHMARK(zsetu(c, 1000000000ULL), 1);
45 BENCHMARK(zneg(c, a), 1);
46 BENCHMARK(zneg(a, a), 1);
47 BENCHMARK(zabs(c, a), 1);
48 BENCHMARK(zabs(a, a), 1);
49 BENCHMARK(zadd_unsigned(c, a, b), 1);
50 BENCHMARK(zsub_unsigned(c, a, b), 1);
51 BENCHMARK(zadd(c, a, b), 1);
52 BENCHMARK(zsub(c, a, b), 1);
53 BENCHMARK(zand(c, a, b), 1);
54 BENCHMARK(zor(c, a, b), 1);
55 BENCHMARK(zxor(c, a, b), 1);
56 BENCHMARK(znot(c, a), 1);
57 BENCHMARK(zeven(a), 1);
58 BENCHMARK(zodd(a), 1);
59 BENCHMARK(zeven_nonzero(a), 1);
60 BENCHMARK(zodd_nonzero(a), 1);
61 BENCHMARK(zzero(a), 1);
62 BENCHMARK(zsignum(a), 1);
63 BENCHMARK(zbits(a), 1);
64 BENCHMARK(zlsb(a), 1);
65 BENCHMARK(zswap(a, b), 1);
66 BENCHMARK(zlsh(c, a, 76), 1);
67 BENCHMARK(zrsh(c, a, 76), 1);
68 BENCHMARK(ztrunc(c, a, 76), 1);
69 BENCHMARK(ztrunc(c, c, 76), 1);
70 BENCHMARK(zsplit(c, d, a, 76), 1);
71 BENCHMARK(zcmpmag(a, b), 1);
72 BENCHMARK(zcmp(a, b), 1);
73 BENCHMARK(zcmpi(a, 1000000000LL), 1);
74 BENCHMARK(zcmpi(a, -1000000000LL), 1);
75 BENCHMARK(zcmpu(a, 1000000000ULL), 1);
76 BENCHMARK(zbset(c, a, 76, 1), 1);
77 BENCHMARK(zbset(a, a, 76, 1), 1);
78 BENCHMARK(zbset(c, a, 76, 0), 1);
79 BENCHMARK(zbset(c, c, 76, 0), 1);
80 BENCHMARK(zbset(c, a, 76, -1), 1);
81 BENCHMARK(zbset(a, a, 76, -1), 1);
82 BENCHMARK(zbtest(a, 76), 1);
83 #ifndef HEBIMATH /* These take too long in hebimath because of inefficient division. */
84 BENCHMARK(zgcd(c, a, b), 0);
85 #endif
86 BENCHMARK(zmul(c, a, b), 0);
87 BENCHMARK(zmul(c, a, a), 0);
88 BENCHMARK(zsqr(c, a), 0);
89 #ifndef HEBIMATH /* Ditto. */
90 zsets(d, "1484298084218938358480511181388394862858002249");
91 BENCHMARK(zmodmul(c, a, b, d), 0);
92 BENCHMARK(zmodmul(c, a, a, d), 0);
93 BENCHMARK(zmodsqr(c, a, d), 0);
94 BENCHMARK(zmodmul(c, a, b, tiny), 0);
95 BENCHMARK(zmodmul(c, a, a, tiny), 0);
96 BENCHMARK(zmodsqr(c, a, tiny), 0);
97 zsets(d, "12");
98 BENCHMARK(zpow(c, a, d), 0); /* Memory corruption when using hebimath. */
99 BENCHMARK(zpowu(c, a, 12), 0); /* Memory corruption when using hebimath. */
100 BENCHMARK(zmodpow(c, a, d, b), 0);
101 BENCHMARK(zmodpowu(c, a, 12, b), 0);
102 #endif
103 BENCHMARK(zsets(c, "5495468234592964023447280368442884381000481887"), 0);
104 BENCHMARK(zstr_length(a, 10), 0);
105 BENCHMARK(zstr(a, buf, 0), 0);
106 BENCHMARK(zstr(a, buf, sizeof(buf) - 1), 0);
107 BENCHMARK(zrand(c, DEFAULT_RANDOM, QUASIUNIFORM, a), 0);
108 BENCHMARK(zrand(c, DEFAULT_RANDOM, UNIFORM, a), 0);
109 BENCHMARK(zrand(c, DEFAULT_RANDOM, MODUNIFORM, a), 0);
110 BENCHMARK(zptest(d, a, 5), 0);
111 BENCHMARK(zsave(a, buf), 1);
112 BENCHMARK(zload(a, buf), 1);
113 BENCHMARK(zdiv(c, a, b), 1);
114 BENCHMARK(zmod(c, a, b), 1);
115 BENCHMARK(zdivmod(c, d, a, b), 1);
116 #ifndef HEBIMATH /* Ditto. */
117 BENCHMARK(zdiv(c, a, tiny), 0);
118 BENCHMARK(zmod(c, a, tiny), 0);
119 BENCHMARK(zdivmod(c, d, a, tiny), 0);
120 #endif
121
122 zfree(a);
123 zfree(b);
124 zfree(c);
125 zfree(d);
126 zfree(tiny);
127 zunsetup();
128 return 0;
129 (void) argc;
130 }