package org.nutz.lang; /** * 秒表 * * @author zozoh(zozohtnt@gmail.com) */ public class Stopwatch { private boolean nano; private long from; private long to; /** * 秒表开始计时,计时时间的最小单位是毫秒 * * @return 开始计时的秒表对象 */ public static Stopwatch begin() { Stopwatch sw = new Stopwatch(); sw.start(); return sw; } /** * 秒表开始计时,计时时间的最小单位是毫微秒 * * @return 开始计时的秒表对象 */ public static Stopwatch beginNano() { Stopwatch sw = new Stopwatch(); sw.nano = true; sw.start(); return sw; } /** * 创建一个秒表对象,该对象的计时时间的最小单位是毫秒 * * @return 秒表对象 */ public static Stopwatch create() { return new Stopwatch(); } /** * 创建一个秒表对象,该对象的计时时间的最小单位是毫微秒 * * @return 秒表对象 */ public static Stopwatch createNano() { Stopwatch sw = new Stopwatch(); sw.nano = true; return sw; } public static Stopwatch run(Runnable atom) { Stopwatch sw = begin(); atom.run(); sw.stop(); return sw; } public static Stopwatch runNano(Runnable atom) { Stopwatch sw = beginNano(); atom.run(); sw.stop(); return sw; } /** * 开始计时,并返回开始计时的时间,该时间最小单位由创建秒表时确定 * * @return 开始计时的时间 */ public long start() { from = currentTime(); return from; } private long currentTime() { return nano ? System.nanoTime() : System.currentTimeMillis(); } /** * 停止计时,并返回停止计时的时间,该时间最小单位由创建秒表时确定 * * @return 停止计时的时间 */ public long stop() { to = currentTime(); return to; } /** * 返回计时结果 * * @return 计时结果 */ public long getDuration() { return to - from; } /** * 开始计时的时间,该时间最小单位由创建秒表时确定 * * @return 开始计时的时间 */ public long getStartTime() { return from; } /** * 停止计时的时间,该时间最小单位由创建秒表时确定 * * @return 停止计时的时间 */ public long getEndTime() { return to; } /** * 返回格式为 <code>Total: [计时时间][计时时间单位] : [计时开始时间]=>[计时结束时间]</code> 的字符串 * * @return 格式为 <code>Total: [计时时间][计时时间单位] : [计时开始时间]=>[计时结束时间]</code> 的字符串 */ @Override public String toString() { return String.format("Total: %d%s : [%s]=>[%s]", this.getDuration(), (nano ? "ns" : "ms"), new java.sql.Timestamp(from).toString(), new java.sql.Timestamp(to).toString()); } }