package com.tomclaw.mandarin.util; /** * Created by Solkin on 08.11.2014. */ public class VariableBuffer { private static final int DEFAULT_BUFFER_SIZE = 128 * 1024; private static final int MAXIMUM_BUFFER_SIZE = 1 * 1024 * 1024; private byte[] buffer; private long executeStart; private long executeTime; private float averageSpeed; private int bufferSize; public VariableBuffer() { reset(); } public void onExecuteStart() { executeStart = System.currentTimeMillis(); executeTime = 0; } public void onExecuteCompleted(int read) { executeTime = System.currentTimeMillis() - executeStart; executeStart = 0; if (executeTime > 0) { float bytesPerSecond = 1000 * read / executeTime; if (averageSpeed > 0) { averageSpeed = (averageSpeed + bytesPerSecond) / 2; } else { averageSpeed = bytesPerSecond; } int size = (int) averageSpeed; if (size < DEFAULT_BUFFER_SIZE) { size = DEFAULT_BUFFER_SIZE; } else if (size > MAXIMUM_BUFFER_SIZE) { size = MAXIMUM_BUFFER_SIZE; } bufferSize = size; Logger.log("speed: " + StringUtil.formatSpeed(averageSpeed) + ", bufferSize: " + bufferSize); } } public void reset() { applyBufferSize(DEFAULT_BUFFER_SIZE); } private void applyBufferSize(int bufferSize) { this.bufferSize = bufferSize; this.buffer = new byte[bufferSize]; } public byte[] getBuffer() { return buffer; } public float getAverageSpeed() { return averageSpeed; } public byte[] calculateBuffer() { buffer = new byte[bufferSize]; return buffer; } }