}
+struct histogram_stats {
+ unsigned count;
+ unsigned long long sum;
+ unsigned avg;
+ unsigned percentile[101];
+};
+
+void histogram_stats(struct histogram *h, struct histogram_stats *s)
+{
+ unsigned long long sum;
+ unsigned i, j;
+
+ if (!s)
+ return;
+
+ memset(s, 0, sizeof(*s));
+
+ for (i = 0; i < h->allocated; i++) {
+ s->count += h->data[i];
+ s->sum += h->data[i] * i * h->resolution;
+ }
+ if (s->count == 0)
+ return;
+
+ s->avg = s->sum / s->count;
+
+ for (i = 0, j = 0, sum = 0; i < 100; i++) {
+ while (sum <= i * s->count / 100)
+ sum += h->data[j++];
+
+ s->percentile[i] = (j-1) * h->resolution;
+ }
+ while (sum < i * s->count / 100)
+ sum += h->data[j++];
+ s->percentile[100] = (j-1) * h->resolution;
+}
#endif