Progress Estimator

本文介绍了一种使用回归分析来估计任务完成所需时间的方法,并提供了一个基于Jakarta Commons Math库的Java实现示例。该示例通过记录任务进度与对应的时间消耗,利用简单线性回归预测剩余时间和总时间。

    Jakarta Commons Cookbook这本书中介绍了一个使用回归分析来估计某个工作需要多长时间的例子。 笔者看过之后感觉有些问题(也可能是笔者数学功底不够)。以下是经过笔者修改后的代码。

 

import org.apache.commons.lang.math.RandomUtils;
import org.apache.commons.lang.time.StopWatch;
import org.apache.commons.math.stat.regression.SimpleRegression;

public class ProgressEstimator {
	//
	private StopWatch stopWatch;
	private SimpleRegression regression;
	
	/**
	 * 
	 */
	public ProgressEstimator() {
		this.stopWatch = new StopWatch();
		this.regression = new SimpleRegression();
	}
	
	/**
	 * 
	 */
	public void start() {
		//
		regression.clear();
		
		//
		stopWatch.reset();
		stopWatch.start();
	}
	
	public void stop() {
		//
		stopWatch.stop();
	}
	
	/**
	 * 
	 */
	public void step(int progress) {
		regression.addData(progress, stopWatch.getTime());
	}
	
	public long getElapsedTime() {
		return stopWatch.getTime();
	}
	
	public long getRemainingTime(long total) {
		long r = (long)(regression.getSlope() * total + regression.getIntercept()) - getElapsedTime();
		return r >= 0 ? r : 0;
	}
	
	
	/**
	 * 
	 */
	public static void main(String args[]) {
		//
		ProgressEstimator pe = new ProgressEstimator();
		pe.start();
		
		//
		int count = 1000;
		for(int i = 0; i < count; i++) {
			//
			try {
				Thread.sleep(RandomUtils.nextInt(30));
			} catch(Exception e) {
				break;
			}
			
			//
			if(i % 10 == 9) {
				//
				pe.step(i);
				
				//
				long elapsed = pe.getElapsedTime();
				long estimatedRemaining = pe.getRemainingTime(count);
				long estimatedTotal = elapsed + estimatedRemaining;
				System.out.println("elapsed time: " + elapsed + ", estimated remaining time: " + estimatedRemaining + ", estimated total: " + estimatedTotal);
			}
		}
		pe.stop();
		System.out.println("total elapsed time: " + pe.getElapsedTime());
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值