All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.ehcache.util.ratestatistics.AbstractRateStatistic Maven / Gradle / Ivy

Go to download

This is the ehcache core module. Pair it with other modules for added functionality.

There is a newer version: 2.6.11
Show newest version
/**
 *  Copyright Terracotta, Inc.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package net.sf.ehcache.util.ratestatistics;

import java.util.concurrent.TimeUnit;

/**
 * Abstract rate statistic implementation.
 * 

* Provides exponentially decaying moving average functionality to subclasses. * * @author Chris Dennis */ abstract class AbstractRateStatistic implements RateStatistic { private final long rateAveragePeriod; /** * Create an abstract statistic using the specified time averaging period. * * @param averagePeriod average period * @param unit period time unit */ AbstractRateStatistic(long averagePeriod, TimeUnit unit) { this.rateAveragePeriod = unit.toNanos(averagePeriod); } /** * Returns the time averaging period in nanoseconds. * * @return average period */ long getRateAveragePeriod() { return rateAveragePeriod; } /** * Combines two timestamped values using a exponentially decaying weighted average. * * @param nowValue current value * @param now current value timestamp * @param thenAverage previous value * @param then previous value timestamp * @return weighted average */ float iterateMovingAverage(float nowValue, long now, float thenAverage, long then) { if (getRateAveragePeriod() == 0 || Float.isNaN(thenAverage)) { return nowValue; } else { float alpha = (float) alpha(now, then); return alpha * nowValue + (1 - alpha) * thenAverage; } } private double alpha(long now, long then) { return -Math.expm1(-((double) (now - then)) / getRateAveragePeriod()); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy