Need an initialization function to set min to -1 to differentiate from an actual min of 0. Signed-off-by: David Ahern <dsahern@gmail.com> Reviewed-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Runzhen Wang <runzhen@linux.vnet.ibm.com> Cc: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> Link: http://lkml.kernel.org/r/1375473947-64285-3-git-send-email-dsahern@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
		
			
				
	
	
		
			63 lines
		
	
	
	
		
			1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
	
		
			1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
#include <math.h>
 | 
						|
 | 
						|
#include "stat.h"
 | 
						|
 | 
						|
void update_stats(struct stats *stats, u64 val)
 | 
						|
{
 | 
						|
	double delta;
 | 
						|
 | 
						|
	stats->n++;
 | 
						|
	delta = val - stats->mean;
 | 
						|
	stats->mean += delta / stats->n;
 | 
						|
	stats->M2 += delta*(val - stats->mean);
 | 
						|
 | 
						|
	if (val > stats->max)
 | 
						|
		stats->max = val;
 | 
						|
 | 
						|
	if (val < stats->min)
 | 
						|
		stats->min = val;
 | 
						|
}
 | 
						|
 | 
						|
double avg_stats(struct stats *stats)
 | 
						|
{
 | 
						|
	return stats->mean;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
 | 
						|
 *
 | 
						|
 *       (\Sum n_i^2) - ((\Sum n_i)^2)/n
 | 
						|
 * s^2 = -------------------------------
 | 
						|
 *                  n - 1
 | 
						|
 *
 | 
						|
 * http://en.wikipedia.org/wiki/Stddev
 | 
						|
 *
 | 
						|
 * The std dev of the mean is related to the std dev by:
 | 
						|
 *
 | 
						|
 *             s
 | 
						|
 * s_mean = -------
 | 
						|
 *          sqrt(n)
 | 
						|
 *
 | 
						|
 */
 | 
						|
double stddev_stats(struct stats *stats)
 | 
						|
{
 | 
						|
	double variance, variance_mean;
 | 
						|
 | 
						|
	if (stats->n < 2)
 | 
						|
		return 0.0;
 | 
						|
 | 
						|
	variance = stats->M2 / (stats->n - 1);
 | 
						|
	variance_mean = variance / stats->n;
 | 
						|
 | 
						|
	return sqrt(variance_mean);
 | 
						|
}
 | 
						|
 | 
						|
double rel_stddev_stats(double stddev, double avg)
 | 
						|
{
 | 
						|
	double pct = 0.0;
 | 
						|
 | 
						|
	if (avg)
 | 
						|
		pct = 100.0 * stddev/avg;
 | 
						|
 | 
						|
	return pct;
 | 
						|
}
 |