home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine CD 1995 / Archive Magazine CD 1995.iso / discs / prog_disc / volume_5 / issue_06 / benchmarks / c_source / fover < prev    next >
Encoding:
Text File  |  1991-06-04  |  4.4 KB  |  200 lines

  1. /*
  2.  * Program to test speed of file access by gaining contents of
  3.  * specified files and dumping them to stdout
  4.  *
  5.  * (c) Martin Houston
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <fcntl.h>
  10. #include <errno.h>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <sys/ndir.h>
  14. #include <sys/timeb.h>
  15.  
  16. #define DATASOURCE "/dev/usr"
  17. #define RDATASOURCE "/dev/rusr"
  18.  
  19. extern int errno;
  20. extern char *sys_errlist[];
  21.  
  22. DIR *opendir();
  23. struct direct *readdir();
  24.  
  25. long time();
  26.  
  27. long nfiles = 0L;               /* number of files accessed */
  28. long bytecount = 0L;            /* total data xfered */
  29.  
  30. main(argc, argv)
  31. int argc;
  32. char **argv;
  33. {
  34.     int file;
  35.     long starttime, endtime, count;
  36.     float mbm,rawmbm,rawrawmbm;
  37.     struct timeb tb;
  38.  
  39.  
  40.     ftime(&tb);
  41.     starttime = (tb.time * 1000) + tb.millitm;
  42.  
  43.     for(file = 1; file < argc; doname(argv[file++]))
  44.         ;
  45.  
  46.     ftime(&tb);
  47.     endtime = (tb.time * 1000) + tb.millitm;
  48.     endtime -=  starttime;
  49.     count = bytecount;
  50.  
  51.     fprintf(stdout,"ft transfers %ld bytes from %ld files in %ld milli-secs\n",
  52.         count, nfiles, endtime);
  53.  
  54.     /* 
  55.      * We have bytes transferred and milli seconds.
  56.      * We want a figure in MB/Min.
  57.      */
  58.     mbm = (float)((float)count / (float)1024 / (float)1024) 
  59.         / (float)((float)endtime / (float)1000 / (float)60);
  60.     fprintf(stdout,"transfer rate = %f MB/MIN\n",mbm);
  61.  
  62.     ftime(&tb);
  63.     starttime = (tb.time * 1000) + tb.millitm;
  64.  
  65.     dofile(DATASOURCE, count);
  66.  
  67.     ftime(&tb);
  68.     endtime = (tb.time * 1000) + tb.millitm;
  69.     endtime -=  starttime;
  70.  
  71.     fprintf(stdout,"ft transfers %ld bytes from %s in %ld milli-secs\n",
  72.         count, DATASOURCE, endtime);
  73.  
  74.     /* 
  75.      * We have bytes transferred and milli seconds.
  76.      * We want a figure in MB/Min.
  77.      */
  78.     rawmbm = (float)((float)count / (float)1024 / (float)1024) 
  79.         / (float)((float)endtime / (float)1000 / (float)60);
  80.     fprintf(stdout,"raw disk transfer rate = %f MB/MIN\n",rawmbm);
  81.     fprintf(stdout,"File system overhead factor = %f \n",rawmbm / mbm);
  82.  
  83.     ftime(&tb);
  84.     starttime = (tb.time * 1000) + tb.millitm;
  85.  
  86.     dofile(RDATASOURCE, count);
  87.  
  88.     ftime(&tb);
  89.     endtime = (tb.time * 1000) + tb.millitm;
  90.     endtime -=  starttime;
  91.  
  92.     fprintf(stdout,"ft transfers %ld bytes from %s in %ld milli-secs\n",
  93.         count, RDATASOURCE, endtime);
  94.  
  95.     /* 
  96.      * We have bytes transferred and milli seconds.
  97.      * We want a figure in MB/Min.
  98.      */
  99.     rawrawmbm = (float)((float)count / (float)1024 / (float)1024) 
  100.         / (float)((float)endtime / (float)1000 / (float)60);
  101.     fprintf(stdout,"raw mode interface transfer rate = %f MB/MIN\n",rawrawmbm);
  102.     fprintf(stdout,"File  & block IO system overhead factor = %f \n",
  103.             rawrawmbm / mbm);
  104.     exit(0);
  105. }
  106.  
  107. doname(name)
  108. char *name;
  109. {
  110.     static struct stat sbuf;
  111.  
  112.     if(stat(name, &sbuf) < 0)
  113.     {
  114.         dobad(name); /* Can't get status */
  115.     }
  116.     else
  117.     if((sbuf.st_mode & S_IFMT) == S_IFDIR)
  118.     {
  119.         dodir(name); /* is a directory */
  120.     }
  121.     else
  122.     if((sbuf.st_mode & S_IFMT) == S_IFREG)
  123.     {
  124.         dofile(name, sbuf.st_size); /* is a file */
  125.     }
  126. }
  127.  
  128. dobad(name)
  129. char *name;
  130. {
  131.     fprintf(stdout,"Error \"%s\" from %s\n", sys_errlist[errno], name);
  132. }
  133.  
  134. dodir(name)
  135. char *name;
  136. {
  137.  
  138.     DIR *dirp;
  139.     struct direct *dp;
  140.  
  141.     if(chdir(name) < 0)
  142.     {
  143.         dobad("Directory Push Operation");
  144.     }
  145.     else
  146.     if((dirp = opendir(".")) != NULL)
  147.     {
  148.         for(dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
  149.         {
  150. #ifdef DEBUG
  151.             fprintf(stdout, "Scanning directory entry %s\n", dp->d_name);
  152. #endif
  153.             if((dp->d_namlen > 2) || 
  154.                (strcmp(dp->d_name, ".") && strcmp(dp->d_name,"..")))
  155.             {
  156.                 /* Not . or .. */
  157.                 doname(dp->d_name);
  158.             }
  159.         }
  160.         closedir(dirp);
  161.     }
  162.     if(chdir("..") < 0)
  163.     {
  164.         dobad("Directory Pop Operation");
  165.     }
  166. }
  167.  
  168. dofile(name, bytes)
  169. char *name;
  170. long bytes;
  171. {
  172.     static char buf[30720];
  173.     int fd, xfer;
  174.  
  175.     /* take stats */
  176.     nfiles++;
  177.     bytecount += bytes;
  178.  
  179. #ifdef DEBUG
  180.     fprintf(stdout, "Xfer of %ld bytes from %s\n", bytes, name);
  181. #endif
  182.  
  183.     if((fd = open(name, O_RDONLY)) < 0)
  184.     {
  185.         dobad(name);
  186.     }
  187.     else
  188.     {
  189.         while(bytes > 0L)
  190.         {
  191.             /* read the file into the buffer */
  192.             xfer = (bytes > (long)sizeof(buf) ? sizeof(buf) : (int)bytes);
  193.             xfer = read(fd, buf, xfer);
  194.             bytes -= xfer;
  195.         }
  196.         close(fd);
  197.     }
  198. }
  199.  
  200.