};
struct counter_data {
- gdouble value;
+ gdouble mean;
+ gdouble stddev;
gint number;
};
/* Cumulative moving average using per-process counter data */
if (cd->number == 0) {
- cd->value = 0;
+ cd->mean = 0;
+ cd->stddev = 0;
}
- cd->value = cd->value + (value - cd->value) / (gdouble)(++cd->number);
+ cd->mean += (value - cd->mean) / (gdouble)(++cd->number);
+ cd->stddev += (value - cd->mean) * (value - cd->mean);
- return cd->value;
+ return cd->mean;
}
static void
if (item->cd->number > 0) {
item->st->avg_counter += item->cd->number + 1;
item->st->avg_time = item->st->avg_time +
- (item->cd->value - item->st->avg_time) /
+ (item->cd->mean - item->st->avg_time) /
(gdouble)item->st->avg_counter;
- item->cd->value = item->st->avg_time;
+ item->cd->mean = item->st->avg_time;
item->cd->number = item->st->avg_counter;
}
}