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 }