This shows you the differences between two versions of the page.
— | loop.c [2013/06/08 11:07] (current) – created - benchmark code peterjeremy | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | <code c> | ||
+ | /* | ||
+ | ** CPU-bound test | ||
+ | */ | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | void runit(double y, int fd, size_t len) | ||
+ | { | ||
+ | double | ||
+ | double *bp; | ||
+ | size_t i; | ||
+ | char ch; | ||
+ | |||
+ | bp = malloc(len); | ||
+ | len /= sizeof(double); | ||
+ | for (i = 0; i < len; i++) | ||
+ | bp[i] = 1.0; | ||
+ | if (write(fd, " | ||
+ | err(1, " | ||
+ | if (read(fd, &ch, 1) != 1) | ||
+ | err(1, " | ||
+ | i = 0; | ||
+ | for (x = 0.0; x < y; x += 1.0) { | ||
+ | bp[i] += x; | ||
+ | if (++i >= len) | ||
+ | i = 0; | ||
+ | } | ||
+ | exit(0); | ||
+ | } | ||
+ | |||
+ | int main(int argc, char **argv) | ||
+ | { | ||
+ | double y; | ||
+ | pid_t p; | ||
+ | int i, j, x; | ||
+ | struct timeval start, end; | ||
+ | struct rusage usage; | ||
+ | int fds[2]; | ||
+ | size_t len; | ||
+ | char *buf; | ||
+ | |||
+ | i = strtol(argv[1], | ||
+ | y = strtod(argv[2], | ||
+ | len = strtoul(argv[3], | ||
+ | |||
+ | if (pipe(fds) < 0) | ||
+ | err(1, " | ||
+ | |||
+ | buf = malloc(i); | ||
+ | for (j = 0; j < i; j++) { | ||
+ | p = fork(); | ||
+ | if (p < 0) | ||
+ | err(1, " | ||
+ | else if (p == 0) | ||
+ | runit(y, fds[1], len); | ||
+ | } | ||
+ | for (j = 0; j < i; j++) { | ||
+ | if (read(fds[0], | ||
+ | err(1, " | ||
+ | } | ||
+ | if (write(fds[0], | ||
+ | err(1, " | ||
+ | |||
+ | gettimeofday(& | ||
+ | while (wait(& | ||
+ | ; | ||
+ | gettimeofday(& | ||
+ | getrusage(RUSAGE_CHILDREN, | ||
+ | |||
+ | end.tv_sec -= start.tv_sec; | ||
+ | end.tv_usec -= start.tv_usec; | ||
+ | if (end.tv_usec < 0) { | ||
+ | end.tv_usec += 1000000; | ||
+ | end.tv_sec--; | ||
+ | } | ||
+ | |||
+ | printf(" | ||
+ | end.tv_sec, | ||
+ | usage.ru_utime.tv_sec, | ||
+ | usage.ru_stime.tv_sec, | ||
+ | return 0; | ||
+ | } | ||
+ | </ |