From cdcac5cf0e9262105e676874d11c4639a80574eb Mon Sep 17 00:00:00 2001 From: Yu-ju Hong Date: Sat, 30 Jul 2011 09:18:13 +0200 Subject: [PATCH] stats: Fix computation of summed standard deviation Fix the computation of standard deviation for a group of jobs. Please see the below link for the approximation formula used. Signed-off-by: Yu-ju Hong Signed-off-by: Jens Axboe --- stat.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/stat.c b/stat.c index 9f22c6e1..8be4be57 100644 --- a/stat.c +++ b/stat.c @@ -474,21 +474,28 @@ static void sum_stat(struct io_stat *dst, struct io_stat *src, int nr) dst->min_val = min(dst->min_val, src->min_val); dst->max_val = max(dst->max_val, src->max_val); - dst->samples += src->samples; /* - * Needs a new method for calculating stddev, we cannot just - * average them we do below for nr > 1 + * Compute new mean and S after the merge + * */ if (nr == 1) { mean = src->mean; S = src->S; } else { - mean = ((src->mean * (double) (nr - 1)) - + dst->mean) / ((double) nr); - S = ((src->S * (double) (nr - 1)) + dst->S) / ((double) nr); + double delta = src->mean - dst->mean; + + mean = ((src->mean * src->samples) + + (dst->mean * dst->samples)) / + (dst->samples + src->samples); + + S = src->S + dst->S + pow(delta, 2.0) * + (dst->samples * src->samples) / + (dst->samples + src->samples); } + dst->samples += src->samples; dst->mean = mean; dst->S = S; } -- 2.25.1