package org.keycloak.testsuite.performance.statistics;
import java.math.BigDecimal;
/**
* Allows to compute statistical values without holding the actual measurements.
*
* @author tkyjovsk
*/
public final class MovingUpdatableStatistic implements UpdatableStatistic {
public static final String STATISTIC_TYPE_PROPERTY_VALUE = "moving";
private BigDecimal sum;
private BigDecimal sumSquare;
private long count;
private long min;
private long max;
public MovingUpdatableStatistic() {
reset();
}
@Override
public synchronized void reset() {
this.sum = new BigDecimal(0);
this.sumSquare = new BigDecimal(0);
count = 0;
min = Long.MAX_VALUE;
max = 0;
}
@Override
public synchronized void addValue(long value) {
sum = sum.add(new BigDecimal(value));
sumSquare = sumSquare.add(new BigDecimal(value * value));
min = Math.min(min, value);
max = Math.max(max, value);
count++;
}
@Override
public synchronized long getCount() {
return count;
}
@Override
public synchronized long getMin() {
return min;
}
@Override
public synchronized long getMax() {
return max;
}
@Override
public synchronized double getAverage() {
return count == 0 ? 0
: sum.longValue() / count;
}
@Override
public synchronized double getStandardDeviation() {
double average = getAverage();
return count == 0 ? 0
: Math.sqrt(sumSquare.longValue() / count - (average * average));
}
@Override
public String toString() {
return Double.toString(getAverage());
}
}