#include #include #include #include "IsaacRand.hh" #define LOOPS 1000000000 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); // Should be a power of two! #define ASIZE 65536 static double dbl_res[ASIZE]; static unsigned long long ull_res[ASIZE]; static unsigned uint_res[ASIZE]; 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; start = timer(); for (i = 0; i < LOOPS; ++i) uint_res[i % ASIZE] = 0; end = timer(); printf ("Empty loop: %5dms\n", end - start); start = timer(); for (i = 0; i < LOOPS; ++i) ull_res[i % ASIZE] = KISS; end = timer(); printf ("Kiss64 (int): %5dms\n", end - start); start = timer(); for (i = 0; i < LOOPS; ++i) dbl_res[i % ASIZE] = (KISS) * ((double)0xFFFFFFFFFFFFFFFFULL); end = timer(); printf ("Kiss64 (dbl): %5dms\n", end - start); start = timer(); for (i = 0; i < LOOPS; ++i) dbl_res[i % ASIZE] = 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) dbl_res[i % ASIZE] = 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; dbl_res[i % ASIZE] = alvo_x = (tmp) - (int) (tmp); } end = timer(); printf ("Alvo (tmp+cast): %5dms\n", end - start); start = timer(); for (i = 0; i < LOOPS; ++i) uint_res[i % ASIZE] = isaac.getNext(); end = timer(); printf ("Isaac: %5dms\n", end - start); return 0; }