return -1;
}
-void histogram_add(struct histogram *h, unsigned value)
+void histogram_add(struct histogram *h, int value)
{
+ if (value < 0) value = 0;
unsigned index = value / h->resolution;
if (index >= h->allocated)
index = h->allocated - 1;
{
unsigned long long sum = 0, cum;
unsigned i;
+
+ if (!f)
+ return;
+
for (i = 0; i < h->allocated; i++)
sum += h->data[i];
cum = sum;
}
+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