/** * Copyright 2011 Intuit Inc. All Rights Reserved */ package com.intuit.tank.vm.common.util; /* * #%L * Intuit Tank Api * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import org.apache.logging.log4j.Logger; import com.intuit.tank.vm.settings.TimeUtil; /** * MethodTimer * * @author dangleton * */ public class MethodTimer { public static final long MS_CONV_FACTOR = 0xf4240L; private Logger log; private String methodName; private long start; private long end; private long mark; private long prevMark; private int numMarks; /** * * @param log * @param clazz * @param methodName */ @SuppressWarnings("rawtypes") public MethodTimer(Logger log, Class clazz, String methodName) { this.log = log; this.methodName = methodName == null ? "" : methodName; start = System.nanoTime(); } public MethodTimer start() { start = System.nanoTime(); return this; } public MethodTimer end() { end = System.nanoTime(); return this; } public MethodTimer mark() { prevMark = mark == 0L ? start : mark; numMarks++; mark = System.nanoTime(); return this; } private long elapsedToMs(long elapsed) { return elapsed / 0xf4240L; } public String getMarkTimeMessage(String message) { return (new StringBuilder(String.valueOf(methodName))).append(" :: ") .append(message == null ? "" : message).append(" took ") .append(elapsedToMs(mark - prevMark)).append(" ms.").toString(); } public String getTimeMessage() { if (end == 0L) end(); return (new StringBuilder(String.valueOf(methodName))).append(" took ") .append(elapsedToMs(end - start)).append(" ms.").toString(); } public String getNaturalTimeMessage() { if (end == 0L) end(); return (new StringBuilder(String.valueOf(methodName))).append(" took ") .append(TimeUtil.toTimeString(elapsedToMs(end - start))).toString(); } public MethodTimer logMark(String message) { if (log != null) { log.info(getMarkTimeMessage(message)); } else { System.out.println(getMarkTimeMessage(message)); } return this; } public MethodTimer markAndLog(String message) { mark(); logMark(message); return this; } public MethodTimer markAndLog() { mark(); logMark((new StringBuilder("Mark (")) .append(Integer.toString(numMarks)).append(")").toString()); return this; } public MethodTimer logTime() { if (log != null) { log.info(getTimeMessage()); } else { System.out.println(getTimeMessage()); } return this; } public MethodTimer endAndLog() { end(); logTime(); return this; } }