Skip to content

Instantly share code, notes, and snippets.

@mrkn
Created September 30, 2011 08:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrkn/1253090 to your computer and use it in GitHub Desktop.
Save mrkn/1253090 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
double
random_double(void)
{
char digs[17];
int i, j;
for (i = j = 0; i < 15 && j < 17; ++i, ++j) {
digs[j] = '0' + ((random() >> 16) % 10);
if (i == j && random()/(double)(0x3fffffff) > 0.5) {
digs[++j] = '.';
}
}
if (i == j) {
digs[16] = digs[15];
digs[15] = '.';
}
digs[17] = '\0';
return strtod(digs, NULL);
}
double
func(double volatile* value)
{
return *value;
}
int
main(int argc, char** argv)
{
long const TRIALS = 1000000;
int i;
double* numbers;
struct timeval start, end;
double consumed;
srandom(time(NULL));
numbers = (double*)malloc(sizeof(double) * 2 * TRIALS);
for (i = 0; i < 2*TRIALS; ++i) {
numbers[i] = random_double();
}
/* add */
printf("add ... ");
gettimeofday(&start, NULL);
for (i = 0; i < TRIALS; ++i) {
double volatile x = numbers[2*i + 0];
double volatile y = numbers[2*i + 1];
double volatile z = x + y;
func(&z);
}
gettimeofday(&end, NULL);
consumed = end.tv_sec + end.tv_usec / 1000000.0;
consumed -= start.tv_sec + start.tv_usec / 1000000.0;
printf("%g [secs]; %g [secs/op]\n", consumed, consumed / (double)TRIALS);
/* sub */
printf("sub ... ");
gettimeofday(&start, NULL);
for (i = 0; i < TRIALS; ++i) {
double volatile z = numbers[2*i + 0] - numbers[2*i + 1];
func(&z);
}
gettimeofday(&end, NULL);
consumed = end.tv_sec + end.tv_usec / 1000000.0;
consumed -= start.tv_sec + start.tv_usec / 1000000.0;
printf("%g [secs]; %g [secs/op]\n", consumed, consumed / (double)TRIALS);
/* mul */
printf("mul ... ");
gettimeofday(&start, NULL);
for (i = 0; i < TRIALS; ++i) {
double x = numbers[2*i + 0];
double y = numbers[2*i + 1];
double z = x * y;
func(&z);
}
gettimeofday(&end, NULL);
consumed = end.tv_sec + end.tv_usec / 1000000.0;
consumed -= start.tv_sec + start.tv_usec / 1000000.0;
printf("%g [secs]; %g [secs/op]\n", consumed, consumed / (double)TRIALS);
free(numbers);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment