⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disksim_stat.c

📁 目前最精确的磁盘模拟器的第3版
💻 C
📖 第 1 页 / 共 2 页
字号:
   double runsquares = 0.0;   double avg = 0.0;   if (statptr->count > 0) {      avg = statptr->runval / (double) statptr->count;      runsquares = statptr->runsquares / (double) statptr->count - (avg*avg);      runsquares = (runsquares > 0.0) ? sqrt(runsquares) : 0.0;   }   fprintf(outfile, "%s%s average: \t%f\n", identstr, statdesc, avg);   fprintf(outfile, "%s%s std.dev.:\t%f\n", identstr, statdesc, runsquares);   if (statptr->maxval == (double) ((int)statptr->maxval)) {      fprintf(outfile, "%s%s maximum:\t%d\n", identstr, statdesc, ((int)statptr->maxval));   } else {      fprintf(outfile, "%s%s maximum:\t%f\n", identstr, statdesc, statptr->maxval);   }   if (buckets > DISTSIZE) {      stat_print_large_dist(&statptr, 1, statptr->count, identstr);      return;   }   fprintf(outfile, "%s%s distribution\n", identstr, statdesc);   for (i=(DISTSIZE-buckets); i<(DISTSIZE-1); i++) {      if (i >= statptr->equals) {         distchar = '<';      }      if (statptr->scale == 1) {         fprintf(outfile, "   %c%3d ", distchar, statptr->distbrks[i]);      } else {         fprintf(outfile, "  %c%4.1f ", distchar, ((double) statptr->distbrks[i] / scale));      }   }   if (statptr->equals == (DISTSIZE-1)) {      intval++;   }   fprintf(outfile, "   %3d+\n", intval);   for (i=(DISTSIZE-buckets); i<DISTSIZE; i++) {      count += statptr->smalldistvals[i];      fprintf(outfile, " %6d ", statptr->smalldistvals[i]);   }   fprintf(outfile, "\n");   ASSERT(count == statptr->count);}void stat_print_set (statgen **statset, int statcnt, char *identstr){   int i, j;   int count = 0;   statgen *statptr = statset[0];   char *statdesc = statptr->statdesc;   int buckets = statptr->distbrks[(DISTSIZE-1)];   int intval = statptr->distbrks[(DISTSIZE-2)];   double runval = 0.0;   double runsquares = 0.0;   double avg = 0.0;   double maxval = statptr->maxval;   double scale = (double) statptr->scale;   int runcount = 0;   int smalldistvals[DISTSIZE];   char distchar = '=';   for (i=0; i<statcnt; i++) {      statptr = statset[i];      if (statptr->count > 0) {         runcount += statptr->count;         runval += statptr->runval;         runsquares += statptr->runsquares;         if (maxval < statptr->maxval) {            maxval = statptr->maxval;         }      }   }   if (runcount > 0) {      avg = runval / (double) runcount;      runsquares = (runsquares / (double) runcount) - (avg*avg);      runsquares = (runsquares > 0.0) ? sqrt(runsquares) : 0.0;   } else {      runsquares = 0.0;   }   fprintf(outputfile, "%s%s average: \t%f\n", identstr, statdesc, avg);   fprintf(outputfile, "%s%s std.dev.:\t%f\n", identstr, statdesc, runsquares);   if (maxval == (double) ((int)maxval)) {      fprintf(outputfile, "%s%s maximum:\t%d\n", identstr, statdesc, (int)maxval);   } else {      fprintf(outputfile, "%s%s maximum:\t%f\n", identstr, statdesc, maxval);   }   if (buckets > DISTSIZE) {      stat_print_large_dist(statset, statcnt, runcount, identstr);      return;   }   fprintf(outputfile, "%s%s distribution\n", identstr, statdesc);   statptr = statset[0];   for (i=(DISTSIZE-buckets); i<(DISTSIZE-1); i++) {      if (i >= statptr->equals) {         distchar = '<';      }      if (statptr->scale == 1) {         fprintf(outputfile, "   %c%3d ", distchar, statptr->distbrks[i]);      } else {         fprintf(outputfile, "  %c%4.1f ", distchar, ((double) statptr->distbrks[i] / (double) scale));      }   }   if (statptr->equals == (DISTSIZE-1)) {      intval++;   }   fprintf(outputfile, "   %3d+\n", intval);   for (i=0; i<DISTSIZE; i++) {      smalldistvals[i] = 0;   }   for (i=0; i<statcnt; i++) {      statptr = statset[i];      for (j=0; j<DISTSIZE; j++) {         smalldistvals[j] += statptr->smalldistvals[j];      }   }   for (i=(DISTSIZE-buckets); i<DISTSIZE; i++) {      count += smalldistvals[i];      fprintf(outputfile, " %6d ", smalldistvals[i]);   }   fprintf(outputfile, "\n");   ASSERT2(count == runcount, "count", count, "runcount", runcount);}void stat_reset (statgen *statptr){   int buckets = statptr->distbrks[(DISTSIZE-1)];   int i;   statptr->count = 0;   statptr->runval = 0.0;   statptr->runsquares = 0.0;   statptr->maxval = 0.0;   if (buckets > DISTSIZE) {      for (i=0; i<buckets; i++) {         statptr->largedistvals[i] = 0;      }   } else {      for (i=0; i<DISTSIZE; i++) {         statptr->smalldistvals[i] = 0;      }   }}static void stat_get_large_dist (FILE *statdef_file, statgen *statptr, int buckets){   int i;   char line[201];   statptr->largedistvals = (int *) DISKSIM_malloc(buckets*sizeof(int));   ASSERT(statptr->largedistvals != NULL);   if (fgets(line, 200, statdef_file) == NULL) {      fprintf(stderr, "Can't get line describing large dist\n");      exit(1);   }   if (sscanf(line, "Start %d  step %d  grow %d", &statptr->distbrks[0], &statptr->distbrks[1], &statptr->distbrks[2]) != 3) {      fprintf(stderr, "Bad format for line describing large dist - %s\n", line);      exit(1);   }   for (i=0; i<buckets; i++) {      statptr->largedistvals[i] = 0;   }   if (statptr->distbrks[2]) {      int grow = statptr->distbrks[2];      int step = statptr->distbrks[1];      int bucketval = statptr->distbrks[0];      int i;      statptr->largediststarts = (int *) DISKSIM_malloc(buckets*sizeof(int));      ASSERT(statptr->largediststarts != NULL);      for (i=0; i < buckets; i++) {         statptr->largediststarts[i] = bucketval;         bucketval += step + (int)((double) (abs(bucketval) * grow) / (double) 100);      }   }}void stat_initialize (FILE *statdef_file, char *statdesc, statgen *statptr){   int i;   int buckets;   char line[201];   char line2[201];   if (fseek(statdef_file, 0L, 0)) {      fprintf(stderr, "Can't rewind the statdef_file\n");      exit(1);   }   sprintf(line2, "%s\n", statdesc);   while (1) {      if (fgets(line, 200, statdef_file) == NULL) {         fprintf(stderr, "No configuration for stat %s given in statdefs file\n", statdesc);         exit(1);      }      if (strcmp(line, line2) == 0) {         break;      }   }   if (fgets(line, 200, statdef_file) == NULL) {      fprintf(stderr, "Stat definition only partially found: %s\n", statdesc);      exit(1);   }   if (sscanf(line, "Distribution size: %d\n", &buckets) != 1) {      fprintf(stderr, "Invalid format for 'distribution size': %s\n", statdesc);      exit(1);   }   if (fgets(line, 200, statdef_file) == NULL) {      fprintf(stderr, "Stat definition only partially found: %s\n", statdesc);      exit(1);   }   if (sscanf(line, "Scale/Equals: %d/%d\n", &statptr->scale, &statptr->equals) != 2) {      fprintf(stderr, "Invalid format for 'scale/equals': %s\n", statdesc);      exit(1);   }   statptr->count = 0;   statptr->runval = 0.0;   statptr->runsquares = 0.0;   statptr->maxval = 0.0;   statptr->statdesc = DISKSIM_malloc (strlen(statdesc)+1);   strcpy (statptr->statdesc, statdesc);   for (i=0; i<DISTSIZE; i++) {      statptr->distbrks[i] = 0;      statptr->smalldistvals[i] = 0;   }   statptr->distbrks[(DISTSIZE-1)] = buckets;   statptr->largedistvals = NULL;   statptr->largediststarts = NULL;   if (buckets > DISTSIZE) {      stat_get_large_dist(statdef_file, statptr, buckets);   }    else {     for (i = 0; i < (DISTSIZE-1); i++) {       if (fscanf(statdef_file, "%d", &statptr->distbrks[i]) != 1) {	 fprintf(stderr, "Distribution buckets only partially specified: %s %d\n", statdesc, i);	 exit(1);       }     }   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -