📄 disksim_stat.c
字号:
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 + -