diff options
Diffstat (limited to 'tools/wrk/src/stats.c')
-rw-r--r-- | tools/wrk/src/stats.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/tools/wrk/src/stats.c b/tools/wrk/src/stats.c new file mode 100644 index 0000000000..a114917bff --- /dev/null +++ b/tools/wrk/src/stats.c @@ -0,0 +1,73 @@ +// Copyright (C) 2012 - Will Glozer. All rights reserved. + +#include <inttypes.h> +#include <stdlib.h> +#include <math.h> + +#include "stats.h" +#include "zmalloc.h" + +stats *stats_alloc(uint64_t samples) { + stats *stats = zcalloc(sizeof(stats) + sizeof(uint64_t) * samples); + stats->samples = samples; + return stats; +} + +void stats_free(stats *stats) { + zfree(stats); +} + +void stats_record(stats *stats, uint64_t x) { + stats->data[stats->index++] = x; + if (stats->limit < stats->samples) stats->limit++; + if (stats->index == stats->samples) stats->index = 0; +} + +uint64_t stats_min(stats *stats) { + uint64_t min = 0; + for (uint64_t i = 0; i < stats->limit; i++) { + uint64_t x = stats->data[i]; + if (x < min || min == 0) min = x; + } + return min; +} + +uint64_t stats_max(stats *stats) { + uint64_t max = 0; + for (uint64_t i = 0; i < stats->limit; i++) { + uint64_t x = stats->data[i]; + if (x > max || max == 0) max = x; + } + return max; +} + +long double stats_mean(stats *stats) { + uint64_t sum = 0; + if (stats->limit == 0) return 0.0; + for (uint64_t i = 0; i < stats->limit; i++) { + sum += stats->data[i]; + } + return sum / (long double) stats->limit; +} + +long double stats_stdev(stats *stats, long double mean) { + long double sum = 0.0; + if (stats->limit < 2) return 0.0; + for (uint64_t i = 0; i < stats->limit; i++) { + sum += powl(stats->data[i] - mean, 2); + } + return sqrtl(sum / (stats->limit - 1)); +} + +long double stats_within_stdev(stats *stats, long double mean, long double stdev, uint64_t n) { + long double upper = mean + (stdev * n); + long double lower = mean - (stdev * n); + uint64_t sum = 0; + + for (uint64_t i = 0; i < stats->limit; i++) { + uint64_t x = stats->data[i]; + if (x >= lower && x <= upper) sum++; + } + + return (sum / (long double) stats->limit) * 100; +} |