📄 speed.java
字号:
/****************************************************************************
* Package : com.ecSolutions.ecAppServer.server.util
* File : Speed.java
* Create Date : 2007-7-20
* Author : Steven Chen
*
* Copyright(C) 2006 ecSolutions(shanghai) Co.,Limited.All Rights Reserved.
*
***************************************************************************/
package com.ecSolutions.ecAppServer.server.util;
/**
* Compute speed.
*
* @author Steven Chen
* @version $Id: Speed.java,v 1.2 2007/07/26 04:00:44 stevenchen Exp $
*/
public final class Speed {
private final ElapsedTime time = new ElapsedTime();
private final int refreshRate;
// instantaneous speed = values[x]*rate[0] + values[x+1]*rate[1] + ... / len
// rate[0] + rate[1] + ... + rate[len-1] = n
// rate[i] > 0
private final long[] values;
private final double[] rate;
private long lastUpdateTimeFactor;
private long currentValue;
private long totalValue;
private Speed(int refreshRate, int n) {
this.refreshRate = refreshRate;
this.values = new long[n];
this.rate = new double[n];
// rate[0] = na , rate[1] = (n-1)a , ... , rate[n-1] = a
// (1 + ... + n) * a = n
// n * (n + 1) * a / 2 = n
double a = (double) 2 / (n + 1);
for (int i = 0; i < rate.length; i++) {
rate[i] = (rate.length - i) * a;
}
}
/**
* create an instance.
*
* @param refreshRate
* refresh rate in ms
* @param period
* period in ms
* @return speed instance
*/
public static Speed getInstance(int refreshRate, int period) {
return period < refreshRate ? null : new Speed(refreshRate, period
/ refreshRate);
}
/**
* create an instance by default parameter.
*
* @return speed instance
*/
public static Speed getInstance() {
return getInstance(1000, 5000);
}
/**
* Reset all values.
*/
public synchronized void reset() {
lastUpdateTimeFactor = 0;
currentValue = 0;
totalValue = 0;
for (int i = 0; i < values.length; i++) {
values[i] = 0;
}
time.reset();
}
private int getIndex(long factor) {
return Math.abs((int) (factor % values.length));
}
private synchronized void update(long timeFactor) {
if (lastUpdateTimeFactor == timeFactor) {
return;
}
values[getIndex(lastUpdateTimeFactor)] = currentValue;
currentValue = 0;
if (lastUpdateTimeFactor < timeFactor - values.length) {
// Reduce Loop
lastUpdateTimeFactor = timeFactor - values.length - 1;
}
// Reset old values
for (long i = lastUpdateTimeFactor + 1; i < timeFactor; i++) {
values[getIndex(i)] = 0;
}
lastUpdateTimeFactor = timeFactor;
}
/**
* Add value, such as received bytes(unit).
*
* @param value
* value
*/
public void addValue(long value) {
if (value > 0) {
long timeFactor = time.getElapsedTime() / refreshRate;
update(timeFactor);
currentValue += value;
totalValue += value;
}
}
/**
* Get total value, such as total received bytes(unit).
*
* @return total value
*/
public long getTotalValue() {
return totalValue;
}
/**
* Get elapsed time(ms).
*
* @return elapsed time
*/
public long getElapsedTime() {
return time.getElapsedTime();
}
/**
* Get average speed(unit/s).
*
* @return average speed
*/
public double getAvgSpeed() {
long elapsedTime = time.getElapsedTime();
if (totalValue == 0 && elapsedTime == 0) {
return 0;
}
return (double) totalValue * 1000 / elapsedTime;
}
/**
* Get current speed(unit/s).
*
* @return current speed
*/
public double getSpeed() {
long timeFactor = time.getElapsedTime() / refreshRate;
update(timeFactor);
double sum = 0;
for (int i = 0; i < values.length; i++) {
int index = getIndex(timeFactor - i - 1);
sum += values[index] * rate[i];
}
return sum * 1000 / refreshRate / values.length;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -