URI: 
       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 }