struct histogram {
unsigned *data;
+ unsigned out_below, out_above;
unsigned allocated;
unsigned resolution;
};
size_t mem;
h->allocated = max_value/resolution + 1;
h->resolution = resolution;
+ h->out_below = h->out_above = 0;
mem = h->allocated*sizeof(*h->data);
h->data = malloc(mem);
if (h->data) {
void histogram_add(struct histogram *h, int value)
{
- if (value < 0) value = 0;
+ if (value < 0) {
+ h->out_below++;
+ return;
+ }
unsigned index = value / h->resolution;
- if (index >= h->allocated)
+ if (index >= h->allocated) {
+ h->out_above++;
index = h->allocated - 1;
+ }
h->data[index]++;
}
unsigned count;
unsigned long long sum;
unsigned avg;
+ unsigned below, above; /* Count of data out of histogram range */
unsigned percentile[101];
};
while (sum < i * s->count / 100)
sum += h->data[j++];
s->percentile[100] = (j-1) * h->resolution;
+
+ s->below = h->out_below;
+ s->above = h->out_above;
}
#endif
histogram_stats(&histogram_gw, &hs);
double avg = hs.count ? (double)hs.sum/hs.count : 0;
fprintf(opt.f_stat, "avg=%g\n", avg);
+ fprintf(opt.f_stat, "out_of_range_below=%d\n", hs.below);
+ fprintf(opt.f_stat, "out_of_range_above=%d\n", hs.above);
for (i = 0; i <= 20; i++)
fprintf(opt.f_stat, "percentile%d=%d\n", i*5, hs.percentile[i*5]);