#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <unistd.h>

#define LOOPCOUNT 20000
int main(int argc, char **argv) {
  int forkcount = 0;
  struct timeval before, after;

  gettimeofday(&before, nullptr);  // once to warm up call path
  gettimeofday(&before, nullptr);  // once for real-sies
  while (1) {
    pid_t p = fork();
    if (p > 0) {
      // parent.
      int loc;
      p = wait(&loc);
      forkcount++;
      if (forkcount == LOOPCOUNT)
        break;
    } else {
      // child
      exit(EXIT_SUCCESS);
    }
  }
  gettimeofday(&after, nullptr);

  float diff_us = (after.tv_sec - before.tv_sec) * 1000000.0;
  diff_us += (after.tv_usec - before.tv_usec);
  diff_us /= LOOPCOUNT;

  printf("microseconds per fork: %f\n", diff_us);
  return EXIT_SUCCESS;
}