package com.vci.client.utils; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; public class TimeMonitor { private Map keyMap = new LinkedHashMap(); private Map beginTimeMap = new LinkedHashMap(); private Map endTimeMap = new LinkedHashMap(); private int timeUnit = 1; // 1:ms(毫秒) 2:s(秒) private int maxLen = 1; public long getCurrentTimeMillis(){ return System.currentTimeMillis(); } public void begin(String key){ begin(key, getCurrentTimeMillis()); } public void begin(String key, long timeMillis){ putToMap(keyMap, beginTimeMap, key, timeMillis); } public void end(String key, boolean appendToEnd){ long begin = beginTimeMap.get(key); removeFromMap(key); long end = getCurrentTimeMillis(); begin(key, begin); end(key, end); } private void removeFromMap(String key){ removeFromMap(key, keyMap); removeFromMap(key, beginTimeMap); removeFromMap(key, endTimeMap); } private void removeFromMap(String key, @SuppressWarnings("rawtypes") Map map){ map.remove(key); } public void end(String key){ end(key, getCurrentTimeMillis()); } public void end(String key, long timeMillis){ putToMap(keyMap, endTimeMap, key, timeMillis); } private void putToMap(Map keyMap, Map timeMap, String key, long timeMillis){ int len = key.length(); if(len > maxLen){ maxLen = len; } keyMap.put(key, key); timeMap.put(key, timeMillis); } public void beginEnd(String key, long begin, long end){ begin(key, begin); end(key, end); } public Long getUseTime(String key){ Long begin = beginTimeMap.get(key); Long end = endTimeMap.get(key); if(begin == null || end == null) return Long.MAX_VALUE; Long span = ((end - begin)); return span; } public String getAllUseTimeInfo(){ String format = getOutFormat(); StringBuffer sb = new StringBuffer(); Iterator its = keyMap.keySet().iterator(); while(its.hasNext()){ String key = its.next(); Long span = getUseTime(key); sb.append(String.format(format, key, String.valueOf(span))).append("\n"); } return sb.toString(); } public String getOutFormat(){ return "%" + String.valueOf(getMaxLen()) + "s: %s(ms)"; } public int getTimeUnit() { return timeUnit; } public void setTimeUnit(int timeUnit) { this.timeUnit = timeUnit; } public int getMaxLen() { return maxLen; } public void setMaxLen(int maxLen) { this.maxLen = maxLen; } @Override public String toString(){ return getAllUseTimeInfo(); } }