#include #include #include #include "IsaacRand.hh" #define LOOPS 100000000 static unsigned long long x=1234567890987654321ULL,c=123456123456123456ULL, y=362436362436362436ULL,z=1066149217761810ULL,t; #define MWC (t=(x<<58)+c, c=(x>>6), x+=t, c+=(x>17), y^=(y<<43) ) #define CNG ( z=6906969069LL*z+1234567 ) #define KISS (MWC+XSH+CNG) static double alvo_s = 1 + 12345.67890123456; static double alvo_x = 1; IsaacRand isaac (1234); unsigned int timer (void) { struct timeval tv; gettimeofday (&tv, NULL); return tv.tv_sec*1000 + tv.tv_usec/1000; } int main (void) { int i; int start, end; unsigned long long k; double k2; unsigned is; start = timer(); for (i = 0; i < LOOPS; ++i); end = timer(); printf ("Empty loop: %5dms\n", end - start); start = timer(); for (i = 0; i < LOOPS; ++i) k = KISS; end = timer(); printf ("Kiss64 (int): %5dms\n", end - start); start = timer(); for (i = 0; i < LOOPS; ++i) k2 = (KISS) / ((double)0xFFFFFFFFFFFFFFFFULL); end = timer(); printf ("Kiss64 (dbl): %5dms\n", end - start); start = timer(); for (i = 0; i < LOOPS; ++i) alvo_x = (alvo_s * alvo_x) - floor (alvo_s * alvo_x); end = timer(); printf ("Alvo (floor): %5dms\n", end - start); alvo_x = 1; start = timer(); for (i = 0; i < LOOPS; ++i) alvo_x = (alvo_s * alvo_x) - (int) (alvo_s * alvo_x); end = timer(); printf ("Alvo (cast): %5dms\n", end - start); alvo_x = 1; start = timer(); for (i = 0; i < LOOPS; ++i) { double tmp = alvo_s * alvo_x; alvo_x = (tmp) - (int) (tmp); } end = timer(); printf ("Alvo (tmp+cast): %5dms\n", end - start); start = timer(); for (i = 0; i < LOOPS; ++i) is = isaac.getNext(); end = timer(); printf ("Isaac: %5dms\n", end - start); return 0; }