#include #include "stat.h" #include "evsel.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; } 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] = { ID(NONE, x), }; #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; } } }