/*
 * Title:        CloudSim Toolkit
 * Description:  CloudSim (Cloud Simulation) Toolkit for Modeling and Simulation of Clouds
 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 *
 * Copyright (c) 2009-2012, The University of Melbourne, Australia
 */

package org.cloudbus.cloudsim.util;

import java.util.HashMap;
import java.util.Map;

/**
 * Measurement of execution times of CloudSim's methods.
 * 
 * @author Anton Beloglazov
 * @since CloudSim Toolkit 3.0
 */
public class ExecutionTimeMeasurer {

	/** A map of execution times where each key
         * represents the name of the method/process being its
         * execution time computed and each key is the
         * time the method/process started (in milliseconds). 
         * Usually, this name is the method/process name, making
         * easy to identify the execution times into the map.
         * 
         * @todo The name of the attribute doesn't match with what it stores.
         * It in fact stores the method/process start time,
         * no the time it spent executing.
         */
	private final static Map<String, Long> executionTimes = new HashMap<String, Long>();

	/**
	 * Start measuring the execution time of a method/process.
         * Usually this method has to be called at the first line of the method
         * that has to be its execution time measured.
	 * 
	 * @param name the name of the method/process being measured.
         * @see #executionTimes
	 */
	public static void start(String name) {
		getExecutionTimes().put(name, System.currentTimeMillis());
	}

	/**
	 * Finalizes measuring the execution time of a method/process.
	 * 
	 * @param name the name of the method/process being measured.
         * @see #executionTimes
	 * @return the time the method/process spent in execution (in seconds)
	 */
	public static double end(String name) {
		double time = (System.currentTimeMillis() - getExecutionTimes().get(name)) / 1000.0;
		getExecutionTimes().remove(name);
		return time;
	}

	/**
	 * Gets map the execution times.
	 * 
	 * @return the execution times map
         * @see #executionTimes
	 */
	public static Map<String, Long> getExecutionTimes() {
		return executionTimes;
	}

}
