package com.tspoon.benchit; import android.util.Pair; import java.util.ArrayList; import java.util.List; public class Result { String tag; ArrayList<Long> times; Benchit.Precision precision; double average; double deviation; long min; long max; Result(Benchmark benchmark) { tag = benchmark.tag; times = benchmark.times; precision = benchmark.precision; average = average(); deviation = deviation(); long[] minMax = range(); min = minMax[0]; max = minMax[1]; } private double average() { int size = times.size(); long total = 0; for (int i = 0; i < size; i++) { total += times.get(i); } return total / (double) size; } private long[] range() { int size = times.size(); long min = times.get(0); long max = times.get(0); for (int i = 0; i < size; i++) { long time = times.get(i); if (time > max) { max = time; } else if (time < min) { min = time; } } return new long[]{min, max}; } private double deviation() { double mean = average(); double temp = 0; int size = times.size(); for (int i = 0; i < size; i++) { long t = times.get(i); temp += (mean - t) * (mean - t); } return Math.sqrt(temp / size); } double getStat(Benchit.Stat stat) { switch (stat) { case AVERAGE: return average; case STANDARD_DEVIATION: return deviation; case RANGE: return max - min; default: throw new IllegalArgumentException("Stat not implemented yet: " + stat); } } public Result log() { List<Pair<String, String>> stats = new ArrayList<>(); stats.add(new Pair<>("Sample Size", times.size() + "")); if (Benchit.STATISTICS.contains(Benchit.Stat.AVERAGE)) { stats.add(new Pair<>("Average", time(average) + precision.unit)); } if (Benchit.STATISTICS.contains(Benchit.Stat.RANGE)) { stats.add(new Pair<>("Range", time(min) + precision.unit + " --> " + time(max) + precision.unit)); } if (Benchit.STATISTICS.contains(Benchit.Stat.STANDARD_DEVIATION)) { stats.add(new Pair<>("Deviation", time(deviation) + precision.unit)); } Benchit.logMany(tag, stats); return this; } private long time(long stat) { return Math.round(stat / (double) precision.divider); } private long time(double stat) { return Math.round(stat / precision.divider); } }