⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 speed.java

📁 银行项目为后台socket通信写的程序
💻 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 + -