-
-
Save JonathonMA/6969386 to your computer and use it in GitHub Desktop.
#include <sys/time.h> | |
#include <sys/wait.h> | |
#include <unistd.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#define C99 | |
struct timeval tv; | |
time_t curtime; | |
void bench(const char* msg) | |
{ | |
struct timeval t0, t1; | |
gettimeofday(&t0, 0); | |
int n = 100; | |
int i; | |
for (i = 0; i < n; i++) { | |
gettimeofday(&tv, 0); | |
curtime = tv.tv_sec; | |
localtime(&curtime); | |
} | |
gettimeofday(&t1, 0); | |
long elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec; | |
printf ("Elapsed: %ldus (%s)\n", elapsed, msg); | |
} | |
int main(int argc, char **argv) { | |
bench("prefork1"); | |
bench("prefork2"); | |
int pid; | |
if (pid = fork()) { | |
bench("parent1"); | |
bench("parent2"); | |
int status; | |
wait(&status); | |
} else { | |
bench("child1"); | |
bench("child2"); | |
} | |
exit(0); | |
} |
JonathonMA
commented
Oct 14, 2013
$ ./a.out
Elapsed: 2445us (prefork1)
Elapsed: 56us (prefork2)
Elapsed: 86us (parent1)
Elapsed: 62us (parent2)
Elapsed: 152886us (child1)
Elapsed: 154634us (child2)
Elapsed: 438 (prefork1)
Elapsed: 46 (prefork2)
Elapsed: 73 (parent1)
Elapsed: 51 (parent2)
Elapsed: 2296 (child1)
Elapsed: 2068 (child2)
On a random Linux server:
$ ./a.out
Elapsed: 1731us (prefork1)
Elapsed: 1594us (prefork2)
Elapsed: 1642us (child1)
Elapsed: 1591us (child2)
Elapsed: 1629us (parent1)
Elapsed: 1600us (parent2)
Elapsed: 1895us (prefork1)
Elapsed: 35us (prefork2)
Elapsed: 75us (parent1)
Elapsed: 34us (parent2)
Elapsed: 142420us (child1)
Elapsed: 151595us (child2)
› ./a.out
Elapsed: 1736us (prefork1)
Elapsed: 34us (prefork2)
Elapsed: 73us (parent1)
Elapsed: 35us (parent2)
Elapsed: 166442us (child1)
Elapsed: 139346us (child2)
~/Desktop $ ./a.out
Elapsed: 2130us (prefork1)
Elapsed: 38us (prefork2)
Elapsed: 58us (parent1)
Elapsed: 35us (parent2)
Elapsed: 151152us (child1)
Elapsed: 150190us (child2)
~/Desktop $ supporter
(jb-fix-donation-link) ~/Code/fundraiser $ desktop
~/Desktop $ ./a.out
Elapsed: 596us (prefork1)
Elapsed: 29us (prefork2)
Elapsed: 45us (parent1)
Elapsed: 28us (parent2)
Elapsed: 2824us (child1)
Elapsed: 2215us (child2)
wongster:~/Desktop simon
$ gcc repro_fork_wtf.c && ./a.out
repro_fork_wtf.c:37:9: warning: using the result of an assignment as a condition without parentheses
[-Wparentheses]
if (pid = fork()) {
~~~~^~~~~~~~
repro_fork_wtf.c:37:9: note: place parentheses around the assignment to silence this warning
if (pid = fork()) {
^
( )
repro_fork_wtf.c:37:9: note: use '==' to turn this assignment into an equality comparison
if (pid = fork()) {
^
==
1 warning generated.
Elapsed: 303us (prefork1)
Elapsed: 23us (prefork2)
Elapsed: 53us (parent1)
Elapsed: 36us (parent2)
Elapsed: 1356us (child1)
Elapsed: 1178us (child2)