home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / tests / benchmarks / bench-4.1 / gausspage.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-05-06  |  1.8 KB  |  101 lines

  1. /*
  2.  * Random page access with
  3.  * a gaussian distribution.
  4.  *
  5.  * Allocate a large (zero fill on demand) address
  6.  * space and fault the pages in a random gaussian
  7.  * order.
  8.  */
  9.  
  10. float    sqrt(), log(), rnd(), cos(), gauss();
  11. char    *valloc();
  12. int    rand();
  13.  
  14. main(argc, argv)
  15.     char *argv[];
  16. {
  17.     register int pn, i, niter, delta;
  18.     register char *pages;
  19.     float sd = 10.0;
  20.     int npages = 4096, pagesize, debug = 0;
  21.     char *name;
  22.  
  23.     name = argv[0];
  24.     argc--, argv++;
  25. again:
  26.     if (argc < 1) {
  27. usage:
  28.         printf(
  29. "usage: %s [ -d ] [ -p #pages ] [ -s standard-deviation ] iterations\n", name);
  30.         exit(1);
  31.     }
  32.     if (strcmp(*argv, "-s") == 0) {
  33.         argc--, argv++;
  34.         if (argc < 1)
  35.             goto usage;
  36.         sscanf(*argv, "%f", &sd);
  37.         if (sd <= 0) {
  38.             printf("%s: Bad standard deviation.\n", *argv);
  39.             exit(2);
  40.         }
  41.         argc--, argv++;
  42.         goto again;
  43.     }
  44.     if (strcmp(*argv, "-p") == 0) {
  45.         argc--, argv++;
  46.         if (argc < 1)
  47.             goto usage;
  48.         npages = atoi(*argv);
  49.         if (npages <= 0) {
  50.             printf("%s: Bad page count.\n", *argv);
  51.             exit(2);
  52.         }
  53.         argc--, argv++;
  54.         goto again;
  55.     }
  56.     if (strcmp(*argv, "-d") == 0) {
  57.         argc--, argv++;
  58.         debug++;
  59.         goto again;
  60.     }
  61.     niter = atoi(*argv);
  62.     pagesize = getpagesize();
  63.     pages = valloc(npages*pagesize);
  64.     if (pages == (char *)0) {
  65.         printf("Can't allocate %d pages (%2.1f megabytes).\n",
  66.             npages, (npages*pagesize) / (1024. * 1024.));
  67.         exit(3);
  68.     }
  69.     pn = 0;
  70.     for (i = 0; i < niter; i++) {
  71.         delta = gauss(sd, 0.0);
  72.         while (pn + delta < 0 || pn + delta > npages)
  73.             delta = gauss(sd, 0.0);
  74.         pn += delta;
  75.         if (debug)
  76.             printf("touch page %d\n", pn);
  77.         else
  78.             pages[pn * pagesize] = 1;
  79.     }
  80. }
  81.  
  82. float
  83. gauss(sd, mean)
  84.     float sd, mean;
  85. {
  86.     register float qa, qb;
  87.  
  88.     qa = sqrt(log(rnd()) * -2.0);
  89.     qb = 3.14159 * rnd();
  90.     return (qa * cos(qb) * sd + mean);
  91. }
  92.  
  93. float
  94. rnd()
  95. {
  96.     static int seed = 1;
  97.     static int biggest = 0x7fffffff;
  98.  
  99.     return ((float)rand(seed) / (float)biggest);
  100. }
  101.