這裡提供個測量執行時間的小API,雖說AOP可以測量每個Method所花的時間,但比較耗時,而且偶爾也有AOP不方便的時候。我常用的是下面這種方法。
TrackingStack.enable(); TrackingStack.push("Execution"); TrackingStack.push("Step1"); //Does something TrackingStack.pop("Step1"); TrackingStack.push("Step2"); //Does something TrackingStack.pop("Step2"); TrackingStack.pop("Execution");跑出來的結果大概會長得像下面這樣
[Execution]:243 ms [Step1]:102 ms [Step2]:104 ms
用的程式如下
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TrackingStack { private static final Logger logger = LoggerFactory.getLogger(TrackingStack.class); private static ThreadLocalcurrent = new ThreadLocal (); private static boolean ENABLE = false; public static final void push(String execution) { if (!ENABLE) { return; } ProfilingBean newPb = new ProfilingBean(execution); newPb.start(); if (null == current.get()) { current.set(newPb); } else { current.get().addChild(newPb); } current.set(newPb); } public static final void pop(String execution) { if (!ENABLE) { return; } ProfilingBean currentPb = current.get(); if (null == currentPb) { return; } if (currentPb.getExecution().equals(execution)) { currentPb.end(); if (null != currentPb.getParent()) { current.set(currentPb.getParent()); } else { logger.info(currentPb.getProfilingMessage()); current.set(null); } } else { logger.info("Current execution sould be [{}], not [{}]", currentPb.getExecution(), execution); } } public static final void enable() { ENABLE = true; } public static final void disable() { ENABLE = false; } }
import java.util.ArrayList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ProfilingBean { private static final Logger logger = LoggerFactory.getLogger(ProfilingBean.class); private ArrayListchildren = new ArrayList (); private ProfilingBean parent = null; private String execution; private long startTime; private long endTime; public ProfilingBean(String execution) { this.execution = execution; } public String getExecution() { return this.execution; } public void start() { this.startTime = System.currentTimeMillis(); } public long getStartTime() { return this.startTime; } public void end() { this.endTime = System.currentTimeMillis(); } public long getEndTime() { return this.endTime; } public long getTotalTime() { return this.endTime - this.startTime; } public void setParent(ProfilingBean parent) { this.parent = parent; } public ProfilingBean getParent() { return this.parent; } public void addChild(ProfilingBean child) { if (null == child) { logger.warn("Child should't be null"); return; } this.children.add(child); child.setParent(this); } public String getProfilingMessage() { return this.getProfilingMessage(""); } private String getProfilingMessage(String indent) { StringBuilder sb = new StringBuilder(); sb.append("\n" + indent + "[" + this.execution + "]:" + (this.endTime - this.startTime) + " ms"); for (ProfilingBean pb : this.children) { sb.append(pb.getProfilingMessage(indent + "\t")); } return sb.toString(); } }
沒有留言:
張貼留言