1/*
2 * from ftp://ftp.netbsd.org/pub/NetBSD/misc/gmcgarry/bench/forkbench.tar.gz
3 */
4
5/* From 4.4 BSD sys/tests/benchmarks/forks.c. */
6
7#include <unistd.h>
8#include <stdlib.h>
9#include <stdio.h>
10#include <sys/time.h>
11#include <sys/wait.h>
12
13/*
14 * Benchmark program to calculate fork+wait
15 * overhead (approximately).  Process
16 * forks and exits while parent waits.
17 * The time to run this program is used
18 * in calculating exec overhead.
19 */
20
21int
22main(argc, argv)
23        char *argv[];
24{
25        int nforks, i;
26        char *cp;
27        int pid, child, status, brksize;
28        struct timeval before, after;
29	unsigned elapsed;
30
31        if (argc < 3) {
32                printf("usage: %s number-of-forks sbrk-size\n", argv[0]);
33                exit(1);
34        }
35        nforks = atoi(argv[1]);
36        if (nforks < 0) {
37                printf("%s: bad number of forks\n", argv[1]);
38                exit(2);
39        }
40        brksize = atoi(argv[2]);
41        if (brksize < 0) {
42                printf("%s: bad size to sbrk\n", argv[2]);
43                exit(3);
44        }
45
46        gettimeofday(&before, NULL);
47        cp = (char *)sbrk(brksize);
48        if (cp == (void *)-1) {
49                perror("sbrk");
50                exit(4);
51        }
52        for (i = 0; i < brksize; i += 1024)
53                cp[i] = i;
54	for (i=0; i<nforks; i++) {
55                child = fork();
56                if (child == -1) {
57                        perror("fork");
58                        exit(-1);
59                }
60                if (child == 0)
61                        _exit(-1);
62                while ((pid = wait(&status)) != -1 && pid != child)
63                        ;
64        }
65        gettimeofday(&after, NULL);
66	elapsed = 1000000 * (after.tv_sec - before.tv_sec);
67	elapsed += (after.tv_usec - before.tv_usec);
68        printf ("Time: %d microseconds.\n", elapsed/nforks);
69        exit(0);
70}
71