Skip to content

Instantly share code, notes, and snippets.

@JonathonMA
Created October 14, 2013 01:25
Show Gist options
  • Save JonathonMA/6969386 to your computer and use it in GitHub Desktop.
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
Copy link
Author

$ gcc repro_fork_wtf.c && ./a.out 
Elapsed: 2108us (prefork1)
Elapsed: 23us (prefork2)
Elapsed: 38us (parent1)
Elapsed: 23us (parent2)
Elapsed: 141489us (child1)
Elapsed: 147498us (child2)

@nippysaurus
Copy link

$ ./a.out 
Elapsed: 2445us (prefork1)
Elapsed: 56us (prefork2)
Elapsed: 86us (parent1)
Elapsed: 62us (parent2)
Elapsed: 152886us (child1)
Elapsed: 154634us (child2)

@langsharpe
Copy link

Elapsed: 438 (prefork1)
Elapsed: 46 (prefork2)
Elapsed: 73 (parent1)
Elapsed: 51 (parent2)
Elapsed: 2296 (child1)
Elapsed: 2068 (child2)

@JonathonMA
Copy link
Author

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)

@soloman1124
Copy link

Elapsed: 1895us (prefork1)
Elapsed: 35us (prefork2)
Elapsed: 75us (parent1)
Elapsed: 34us (parent2)
Elapsed: 142420us (child1)
Elapsed: 151595us (child2)

@leonfu103
Copy link

› ./a.out
Elapsed: 1736us (prefork1)
Elapsed: 34us (prefork2)
Elapsed: 73us (parent1)
Elapsed: 35us (parent2)
Elapsed: 166442us (child1)
Elapsed: 139346us (child2)

@orodio
Copy link

orodio commented Oct 15, 2013

 ~/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)

@sjpwong
Copy link

sjpwong commented Oct 15, 2013

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)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment