#define _GNU_SOURCE 1 #include #include #include #include #include #include #include #include #include #include "timer-map.h" #define START_CT 1000 #define FULL_CT (1000 * 1000 * 1000) typedef struct { struct timeval start, middle, end; } race_times_t; volatile char extern_ch; char const * text = NULL; void print_timings(race_times_t * pb, race_times_t * mac); void use_strpbrk(int ct) { while (ct-- > 0) { char * p = strpbrk(text, "#~"); extern_ch = *p; } } void use_macros(int ct) { while (ct-- > 0) { char * p = SPN_HASH_CHARS(text); extern_ch = *p; } } void map_file(char const * fname) { struct stat sb; int sres = stat(fname, &sb); int fd = open(fname, O_RDONLY); void * map = mmap(NULL, sb.st_size+1, PROT_READ, MAP_SHARED, fd, 0); if ((sres < 0) || (fd < 0) || (map == MAP_FAILED)) exit(1); text = map; } int main(int argc, char ** argv) { race_times_t for_strpbrk; race_times_t for_macros; { char const * fn = argv[1] ? argv[1] : __FILE__; map_file(fn); } gettimeofday(&for_strpbrk.start, NULL); use_strpbrk(START_CT); gettimeofday(&for_strpbrk.middle, NULL); use_strpbrk(FULL_CT); gettimeofday(&for_strpbrk.end, NULL); for_macros.start = for_strpbrk.end; use_macros(START_CT); gettimeofday(&for_macros.middle, NULL); use_macros(FULL_CT); gettimeofday(&for_macros.end, NULL); print_timings(&for_strpbrk, &for_macros); return 0; } int delta(struct timeval * s, struct timeval * e) { if (s->tv_sec == e->tv_sec) return (500 + e->tv_usec - s->tv_usec) / 1000; int msec = (500 + (1000000 - s->tv_usec) + e->tv_usec) / 1000; return msec + ((e->tv_sec - s->tv_sec) - 1) * 1000; } void fmtnum(char * buf, int msec) { int len = sprintf(buf, "%04u", msec); char * p = buf + len - 3; memmove(p+1, p, 4); *p = '.'; } void print_timings(race_times_t * pb, race_times_t * mac) { static char const fmt[] = "%-10s startup time: %9s run time: %12s\n"; int delta1 = delta(&pb->start, &pb->middle); int delta2 = delta(&pb->middle, &pb->end); char buf1[32], buf2[32]; fmtnum(buf1, delta1); fmtnum(buf2, delta2); printf(fmt, "strpbrk", buf1, buf2); delta1 = delta(&mac->start, &mac->middle); delta2 = delta(&mac->middle, &mac->end); fmtnum(buf1, delta1); fmtnum(buf2, delta2); printf(fmt, "macros", buf1, buf2); }