#include #include #include #include #include #include #include #include #define NR_FORKS 100000 static inline uint64_t get_cycles(void) { uint64_t t; volatile int dont_remove __attribute__((unused)); unsigned tmp; __asm volatile ("cpuid" : "=a"(tmp), "=b"(tmp), "=c"(tmp), "=d"(tmp): "a" (0)); dont_remove = tmp; __asm volatile ("rdtsc" : "=A"(t)); return t; } int main(int argc, char **argv) { void *addr = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); int i = NR_FORKS, j = 1; assert(addr != MAP_FAILED); while (i-- > 0) { pid_t child = fork(); uint64_t before, after; assert(child != -1); if (!child) { *(uint64_t *)addr = get_cycles(); return 0; } assert(child == waitpid(child, NULL, 0)); before = *(uint64_t *)addr; after = get_cycles(); printf("%u\n", (unsigned)(after - before)); fflush(stdout); } return 0; }