public MovingAverage(int movingAvgWindowMs, int movingAvgBucketSizeMs) { this.movingAvgBucketSizeMs = movingAvgBucketSizeMs; this.buffer = new RingBuffer<Double>(movingAvgWindowMs / movingAvgBucketSizeMs); }
private void nextBucket(Double average) { Double oldest = null; if (buffer.willOverwrite()) oldest = buffer.getOldest(); buffer.add(average); if (average != null) { bufferSum += average; bufferCount++; } if (oldest != null) { bufferSum -= oldest; bufferCount--; } }
public synchronized void reset() { buffer.clear(); bufferSum = 0; bufferCount = 0; currentBucketSum = 0; currentBucketCount = 0; firstUpdateValid = false; firstBucket = 0; }
private void updateSpeed(long now, long bytesRead, long fileLength) { float elapsed = (now - lastSpeedUpdate) / 1000.f; if (elapsed > speedUpdateInterval) { lastSpeedUpdate = now; long processed = bytesRead - lastBytesRead; lastBytesRead = bytesRead; currentSpeed = processed / elapsed; speedBuffer.add(currentSpeed); avgSpeed = 0; for (float speed : speedBuffer) avgSpeed += speed; avgSpeed /= speedBuffer.size(); if (speedBuffer.size() > 10) eta = (fileLength - bytesRead) / avgSpeed / 60.0f; } } }
public void add(T x) { buffer[(start + fill) % buffer.length] = x; if (willOverwrite()) { ++start; start %= buffer.length; } else { ++fill; } }
int bucket = (int) (sinceFirstUpdate / movingAvgBucketSizeMs); int advance = bucket - firstBucket; if (advance > buffer.getCapacity())
public SpeedMeter( float progressUpdateIntervalInSeconds, float speedUpdateIntervalInSeconds, float etaWindowLengthInSeconds) { this.progressUpdateInterval = progressUpdateIntervalInSeconds; this.speedUpdateInterval = speedUpdateIntervalInSeconds; int capacity = (int) (etaWindowLengthInSeconds / speedUpdateInterval); if (capacity <= 0 || capacity > 4096) throw new IllegalArgumentException("Cannot realize ETA configuration"); this.speedBuffer = new RingBuffer<Float>( capacity); }