2012-09-17 16:31:14 +08:00
# include <math.h>
# include "stat.h"
2015-06-04 15:50:55 +02:00
# include "evsel.h"
2012-09-17 16:31:14 +08:00
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 ) ;
2013-08-02 14:05:40 -06:00
if ( val > stats - > max )
stats - > max = val ;
if ( val < stats - > min )
stats - > min = val ;
2012-09-17 16:31:14 +08:00
}
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 ;
2013-05-25 18:24:48 -06:00
if ( stats - > n < 2 )
2012-09-17 16:31:14 +08:00
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 ;
}
2015-06-04 15:50:55 +02:00
bool __perf_evsel_stat__is ( struct perf_evsel * evsel ,
enum perf_stat_evsel_id id )
{
struct perf_stat * ps = evsel - > priv ;
return ps - > id = = id ;
}
# define ID(id, name) [PERF_STAT_EVSEL_ID__##id] = #name
static const char * id_str [ PERF_STAT_EVSEL_ID__MAX ] = {
2015-06-03 16:25:52 +02:00
ID ( NONE , x ) ,
ID ( CYCLES_IN_TX , cpu / cycles - t / ) ,
ID ( TRANSACTION_START , cpu / tx - start / ) ,
ID ( ELISION_START , cpu / el - start / ) ,
ID ( CYCLES_IN_TX_CP , cpu / cycles - ct / ) ,
2015-06-04 15:50:55 +02:00
} ;
# undef ID
void perf_stat_evsel_id_init ( struct perf_evsel * evsel )
{
struct perf_stat * ps = evsel - > priv ;
int i ;
/* ps->id is 0 hence PERF_STAT_EVSEL_ID__NONE by default */
for ( i = 0 ; i < PERF_STAT_EVSEL_ID__MAX ; i + + ) {
if ( ! strcmp ( perf_evsel__name ( evsel ) , id_str [ i ] ) ) {
ps - > id = i ;
break ;
}
}
}
2015-06-14 10:19:26 +02:00
2015-06-26 11:29:11 +02:00
struct perf_counts * perf_counts__new ( int ncpus , int nthreads )
2015-06-14 10:19:27 +02:00
{
2015-06-26 11:29:10 +02:00
struct perf_counts * counts = zalloc ( sizeof ( * counts ) ) ;
2015-06-14 10:19:27 +02:00
2015-06-26 11:29:10 +02:00
if ( counts ) {
struct xyarray * cpu ;
2015-06-26 11:29:11 +02:00
cpu = xyarray__new ( ncpus , nthreads , sizeof ( struct perf_counts_values ) ) ;
2015-06-26 11:29:10 +02:00
if ( ! cpu ) {
free ( counts ) ;
return NULL ;
}
counts - > cpu = cpu ;
}
return counts ;
2015-06-14 10:19:27 +02:00
}
void perf_counts__delete ( struct perf_counts * counts )
{
2015-06-26 11:29:10 +02:00
if ( counts ) {
xyarray__delete ( counts - > cpu ) ;
free ( counts ) ;
}
2015-06-14 10:19:27 +02:00
}
2015-06-26 11:29:10 +02:00
static void perf_counts__reset ( struct perf_counts * counts )
2015-06-14 10:19:27 +02:00
{
2015-06-26 11:29:10 +02:00
xyarray__reset ( counts - > cpu ) ;
2015-06-14 10:19:27 +02:00
}
2015-06-26 11:29:10 +02:00
void perf_evsel__reset_counts ( struct perf_evsel * evsel )
2015-06-14 10:19:26 +02:00
{
2015-06-26 11:29:10 +02:00
perf_counts__reset ( evsel - > counts ) ;
2015-06-14 10:19:26 +02:00
}
2015-06-26 11:29:11 +02:00
int perf_evsel__alloc_counts ( struct perf_evsel * evsel , int ncpus , int nthreads )
2015-06-14 10:19:26 +02:00
{
2015-06-26 11:29:11 +02:00
evsel - > counts = perf_counts__new ( ncpus , nthreads ) ;
2015-06-14 10:19:26 +02:00
return evsel - > counts ! = NULL ? 0 : - ENOMEM ;
}
void perf_evsel__free_counts ( struct perf_evsel * evsel )
{
2015-06-14 10:19:27 +02:00
perf_counts__delete ( evsel - > counts ) ;
evsel - > counts = NULL ;
2015-06-14 10:19:26 +02:00
}