home *** CD-ROM | disk | FTP | other *** search
/ CD-ROM Aktief 1995 #3 / CDA3.iso / os2 / diskio14.rar / DISKIO.C < prev    next >
C/C++ Source or Header  |  1994-07-11  |  5KB  |  226 lines

  1. /* diskio.c - disk benchmark
  2.  *
  3.  * Author:  Kai Uwe Rommel <rommel@ars.muc.de>
  4.  * Created: Fri Jul 08 1994
  5.  */
  6.  
  7. static char *rcsid =
  8. "$Id: diskio.c,v 1.4 1994/07/11 14:23:00 rommel Exp $";
  9. static char *rcsrev = "$Revision: 1.4 $";
  10.  
  11. /*
  12.  * $Log: diskio.c,v $
  13.  * Revision 1.4  1994/07/11 14:23:00  rommel
  14.  * changed latency timing
  15.  *
  16.  * Revision 1.3  1994/07/09 13:07:20  rommel
  17.  * changed transfer speed test
  18.  *
  19.  * Revision 1.2  1994/07/08 21:53:05  rommel
  20.  * cleanup
  21.  *
  22.  * Revision 1.1  1994/07/08 21:29:41  rommel
  23.  * Initial revision
  24.  * 
  25.  */
  26.  
  27. #define INTERVAL 10
  28.  
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <string.h>
  32.  
  33. #define INCL_DOS
  34. #define INCL_DOSDEVICES
  35. #define INCL_DOSDEVIOCTL
  36. #define INCL_DOSERRORS
  37. #define INCL_NOPM
  38. #include <os2.h>
  39.  
  40. #include "diskacc2.h"
  41.  
  42. int nHandle;
  43. unsigned nSides, nTracks, nSectors;
  44. char *pBuffer;
  45.  
  46. HEV hSemTimer;
  47. HTIMER hTimer;
  48. QWORD nStart, nStop;
  49.  
  50. int start_timer(void)
  51. {
  52.   ULONG nPost;
  53.   APIRET rc;
  54.  
  55.   if ((rc = DosResetEventSem(hSemTimer, &nPost)) && rc != ERROR_ALREADY_RESET)
  56.     return printf("Semaphore error.\n"), -1;
  57.  
  58.   if(DosAsyncTimer(INTERVAL * 1000, (HSEM) hSemTimer, &hTimer))
  59.     return printf("Timer error.\n"), -1;
  60.  
  61.   if (DosTmrQueryTime(&nStart))
  62.     return printf("Timer error.\n"), -1;
  63.  
  64.   nPost = 0;
  65.  
  66.   return 0;
  67. }
  68.  
  69. int time_over(void)
  70. {
  71.   ULONG nPost;
  72.  
  73.   if (DosQueryEventSem(hSemTimer, &nPost))
  74.     return printf("Semaphore error.\n"), 1;
  75.  
  76.   return nPost;
  77. }
  78.  
  79. int stop_timer(int accuracy)
  80. {
  81.   ULONG nFreq;
  82.  
  83.   if (DosTmrQueryTime(&nStop))
  84.     return printf("Timer error.\n"), -1;
  85.   if (DosTmrQueryFreq(&nFreq))
  86.     return printf("Timer error.\n"), -1;
  87.  
  88.   nFreq = (nFreq + accuracy / 2) / accuracy;
  89.  
  90.   return (nStop.ulLo - nStart.ulLo) / nFreq;
  91. }
  92.  
  93. int bench_transfer(void)
  94. {
  95.   int nCnt, nData = 0, nTime;
  96.  
  97.   printf("Data transfer rate: ");
  98.   fflush(stdout);
  99.  
  100.   if (start_timer())
  101.     return -1;
  102.  
  103.   for (nCnt = 0; !time_over(); nCnt++)
  104.   {
  105.     if (DskRead(nHandle, nCnt % nSides, nCnt / nSides, 1, nSectors, pBuffer))
  106.       return printf("Disk read error.\n"), -1;
  107.  
  108.     nData += nSectors * 512;
  109.   }
  110.  
  111.   if ((nTime = stop_timer(1024)) == -1)
  112.     return -1;
  113.  
  114.   printf("%d k/sec\n", nData / nTime);
  115. }
  116.  
  117. int bench_latency(void)
  118. {
  119.   int nCnt, nSector, nTime;
  120.  
  121.   printf("Average latency time: ");
  122.   fflush(stdout);
  123.  
  124.   srand(1);
  125.  
  126.   if (start_timer())
  127.     return -1;
  128.  
  129.   for (nCnt = 0; !time_over(); nCnt++)
  130.   {
  131.     nSector = rand() * nSectors / RAND_MAX + 1;
  132.  
  133.     if (DskRead(nHandle, 0, 0, nSector, 1, pBuffer))
  134.       return printf("Disk read error.\n"), -1;
  135.   }
  136.  
  137.   if ((nTime = stop_timer(1000)) == -1)
  138.     return -1;
  139.  
  140.   nTime = nTime * 10 / nCnt;
  141.  
  142.   printf("%d.%d ms\n", nTime / 10, nTime % 10);
  143.  
  144.   return nTime;
  145. }
  146.  
  147. int bench_seek(int nLatency)
  148. {
  149.   int nCnt, nTrack, nTime;
  150.  
  151.   printf("Average seek time: ");
  152.   fflush(stdout);
  153.  
  154.   srand(1);
  155.  
  156.   if (start_timer())
  157.     return -1;
  158.  
  159.   for (nCnt = 0; !time_over(); nCnt++)
  160.   {
  161.     nTrack = rand() * nTracks / RAND_MAX;
  162.  
  163.     if (DskRead(nHandle, 0, nTrack, 1, 1, pBuffer))
  164.       return printf("Disk read error.\n"), -1;
  165.   }
  166.  
  167.   if ((nTime = stop_timer(1000)) == -1)
  168.     return -1;
  169.  
  170.   nTime = nTime * 10 / nCnt;
  171.  
  172.   printf("%d.%d ms\n", (nTime - nLatency) / 10, (nTime - nLatency) % 10);
  173.   printf("Average data access time: %d.%d ms\n", nTime / 10, nTime % 10);
  174. }
  175.  
  176. int bench_disk(int nDisk)
  177. {
  178.   char szName[8];
  179.  
  180.   sprintf(szName, "$%d:", nDisk);
  181.  
  182.   if ((nHandle = DskOpen(szName, 0, &nSides, &nTracks, &nSectors)) < 0)
  183.     return printf("\nCannot access disk %d.\n", nDisk), -1;
  184.  
  185.   printf("\nDisk %d: %d sides, %d cylinders, %d sectors per track = %d MB\n", 
  186.      nDisk, nSides, nTracks, nSectors,
  187.      nSides * nTracks * nSectors / 2048);
  188.  
  189.   if ((pBuffer = malloc(nSectors * 512)) == NULL)
  190.     return printf("\nNot enough memory.\n"), -1;
  191.  
  192.   bench_transfer();
  193.   bench_seek(bench_latency());
  194.  
  195.   free(pBuffer);
  196.   DskClose(nHandle);
  197.  
  198.   return 0;
  199. }
  200.  
  201. int main(void)
  202. {
  203.   char szVersion[32];
  204.   USHORT nDisks;
  205.   int nCount;
  206.  
  207.   strcpy(szVersion, rcsrev + sizeof("$Revision: ") - 1);
  208.   *strchr(szVersion, ' ') = 0;
  209.  
  210.   printf("\nDISKIO - Fixed Disk Benchmark, Version %s"
  211.      "\n(C) 1994 Kai Uwe Rommel\n", szVersion);
  212.  
  213.   if (DosPhysicalDisk(INFO_COUNT_PARTITIONABLE_DISKS, &nDisks, sizeof(nDisks), 0, 0))
  214.     return printf("\nCannot determine number of disks.\n"), 1;
  215.  
  216.   printf("\nNumber of fixed disks: %d\n", nDisks);
  217.  
  218.   DosCreateEventSem(NULL, &hSemTimer, DC_SEM_SHARED, 0);
  219.   DosSleep(1000);
  220.  
  221.   for (nCount = 1; nCount <= nDisks; nCount++)
  222.     bench_disk(nCount);
  223. }
  224.  
  225. /* end of diskio.c */
  226.