// command line to compile and link: // ~/AFSWD/install/gcc-4.3.2/binsh/gcc -mtune=native -march=native -Wall -O3 benchmark_sin.c -o benchmark_sin -lm -lrt // command line to run: // ./benchmark_sin #include #include #include #include #include #include #include #define MEASURE_WALLCLOCK_TIME(message, code, line_number, file) \ { \ struct timespec start_time_struct; \ struct timespec end_time_struct; \ \ clock_gettime(CLOCK_MONOTONIC, &start_time_struct); \ {\ code; \ }\ clock_gettime(CLOCK_MONOTONIC, &end_time_struct); \ time_t seconds_diff = end_time_struct.tv_sec - start_time_struct.tv_sec; \ long nanoseconds_diff = end_time_struct.tv_nsec - start_time_struct.tv_nsec; \ fprintf(stderr, "%s took %g seconds at line #%d of '%s' file\n", message, (double)seconds_diff + 1e-9 * (double)nanoseconds_diff, line_number, file);\ } #define MEASURE_CPU_TIME(message, code, line_number, file) \ { \ clock_t start_time = clock(); \ { \ code; \ } \ fprintf(stderr, "%s took %g seconds at line number %d of '%s' file\n", message, (((double)clock() - (double)start_time) / (double)CLOCKS_PER_SEC), line_number, file); \ } #define N ((unsigned)1000000) double ___angles[N]; double ___sins[N]; int main() { { unsigned en; for(en = 0; en < N; en++) { ___angles[en] = M_PI * ((double)en) / (double)(N); } } MEASURE_WALLCLOCK_TIME ( "Wallclock time", // message, { MEASURE_CPU_TIME ( "CPU time", // message, { unsigned en; for(en = 0; en < N; en++) { ___sins[en] = sin(___angles[en]); } }, // code, __LINE__, // line_number, __FILE__ // file ) }, // code, __LINE__, // line_number, __FILE__ // file ) return 0; }