--- ab.c-share_statistics-7 2008-07-07 18:00:00.000000000 +0200 +++ ab.c-html_conf_perc-8 2008-07-07 18:00:05.000000000 +0200 @@ -1184,12 +1184,52 @@ (double) (totalread + totalposted) / 1024 / timetaken); } } - { - if (done > 0) { /* avoid division by zero (if 0 done) */ - basic_stats_t *r = calculate_basic_results(); - printf("Connection Times (ms)\n", - trstring, tdstring); + if (done > 0) { /* avoid division by zero (if 0 done) */ + int i; + basic_stats_t *r = calculate_basic_results(); + + printf("Connection Times (ms)\n", + trstring, tdstring); + if (confidence) { + confidence_stats_t *s = calculate_confidence_results(r); + printf(" minmean+/-sdmedianmax\n", + trstring, tdstring, tdstring, tdstring, tdstring, tdstring, tdstring); +#define CONF_FMT_STRING "%5" APR_TIME_T_FMT "%4" APR_TIME_T_FMT "%5.1f%6" APR_TIME_T_FMT "%7" APR_TIME_T_FMT "\n" + printf("Connect:" CONF_FMT_STRING, + trstring, tdstring, tdstring, r->mincon, tdstring, r->meancon, + tdstring, s->sdcon, tdstring, s->mediancon, tdstring, r->maxcon); + printf("Processing:" CONF_FMT_STRING, + trstring, tdstring, tdstring, r->mind, tdstring, r->meand, + tdstring, s->sdd, tdstring, s->mediand, tdstring, r->maxd); + printf("Waiting:" CONF_FMT_STRING, + trstring, tdstring, tdstring, r->minwait, tdstring, r->meanwait, + tdstring, s->sdwait, tdstring, s->medianwait, tdstring, r->maxwait); + printf("Total:" CONF_FMT_STRING, + trstring, tdstring, tdstring, r->mintot, tdstring, r->meantot, + tdstring, s->sdtot, tdstring, s->mediantot, tdstring, r->maxtot); +#undef CONF_FMT_STRING + +#define SANE(what,mean,median,sd) \ + { \ + double d = (double)mean - median; \ + if (d < 0) d = -d; \ + if (d > 2 * sd ) \ + printf("%s\n", \ + trstring, tdstring, "ERROR: The median and mean for " what " are more than twice the standard " \ + "deviation apart. These results are NOT reliable."); \ + else if (d > sd ) \ + printf("%s\n", \ + trstring, tdstring, "WARNING: The median and mean for " what " are not within a normal deviation " \ + "These results are probably not that reliable."); \ + } + SANE("the initial connection time", r->meancon, s->mediancon, s->sdcon); + SANE("the processing time", r->meand, s->mediand, s->sdd); + SANE("the waiting time", r->meanwait, s->medianwait, s->sdwait); + SANE("the total time", r->meantot, s->mediantot, s->sdtot); +#undef SANE + } + else { printf("  min avg max\n", trstring, tdstring, tdstring, tdstring, tdstring); #define CONF_FMT_STRING "%5" APR_TIME_T_FMT "%5" APR_TIME_T_FMT "%5" APR_TIME_T_FMT "\n" @@ -1203,6 +1243,29 @@ trstring, tdstring, tdstring, r->mintot, tdstring, r->meantot, tdstring, r->maxtot); #undef CONF_FMT_STRING } + + if (!confidence) { + qsort(stats, done, sizeof(struct data), + (int (*) (const void *, const void *)) comprando); + } + + /* Sorted on total connect times */ + if (percentile && (done > 1)) { + printf("%s\n", + trstring, tdstring, "Percentage of the requests served within a certain time (ms)"); + for (i = 0; i < sizeof(percs) / sizeof(int); i++) { + if (percs[i] <= 0) + printf("0%%:<0>(never)\n", + trstring, tdstring, tdstring); + else if (percs[i] >= 100) + printf("100%%:%5" APR_TIME_T_FMT " (longest request)\n", + trstring, tdstring, tdstring, ap_round_ms(stats[done - 1].time)); + else + printf("%d%%:%5" APR_TIME_T_FMT "\n", + trstring, tdstring, percs[i], tdstring, ap_round_ms(stats[(int) (done * percs[i] / 100)].time)); + } + } + printf("\n"); if (csvperc) {