/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.tools.debug.core.util;
import com.google.dart.tools.debug.core.DartDebugCorePlugin;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
/**
* A simple class to measure timings in the debugger.
*/
public class LogTimer {
public static interface LogListener {
/**
* Handle a log event w/ the given action name and duration (in milliseconds).
*
* @param actionName
* @param durationMs
*/
public void timerLog(String actionName, long durationMs);
}
private static boolean ENABLE = false;
private static List<LogListener> listeners = new ArrayList<LogTimer.LogListener>();
public static void addLogListener(LogListener listener) {
listeners.add(listener);
}
public static void removeLogListener(LogListener listener) {
listeners.remove(listener);
}
private String name;
private long startTime;
private String taskName;
private long taskStart;
/**
* This formatter always shows the thousandths position (0.000).
*/
private static final NumberFormat numberFormat = new DecimalFormat("#.###");
/**
* Create a new LogTimer.
*
* @param name
*/
public LogTimer(String name) {
this.name = name;
this.startTime = System.currentTimeMillis();
}
/**
* Start a sub-task timer. This does not interfere with the main timer.
*
* @param taskName
*/
public void startTask(String taskName) {
this.taskName = taskName;
this.taskStart = System.currentTimeMillis();
}
/**
* Stop a sub-task timer. This does not interfere with the main timer.
*/
public void stopTask() {
long duration = System.currentTimeMillis() - taskStart;
if (ENABLE) {
DartDebugCorePlugin.logInfo(taskName + " time: " + duration + "ms");
}
taskName = null;
}
/**
* Stop the timer, and log the duration to the Eclipse .log.
*/
public void stopTimer() {
long duration = System.currentTimeMillis() - startTime;
if (ENABLE) {
DartDebugCorePlugin.logInfo(name + " total time: " + getSeconds(duration) + " sec");
}
for (LogListener listener : listeners) {
listener.timerLog(name, duration);
}
}
private String getSeconds(long durationMs) {
return numberFormat.format(durationMs / 1000.0);
}
}