/********************************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
 *
 * 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.
 * 
 * Performance timers.
 *
 * Author:  Alan F. Gates (gates@)
 * $Header:$
 */

package org.apache.pig.tools.timer;

import java.io.PrintStream;
import java.lang.String;

public class PerformanceTimer
{

/**
 * Start the timer.
 */
public void start()
{
    mStartedAt = System.nanoTime();
    mStarts++;
    mState = State.RUNNING;
}

/**
 * Stop the timer.
 */
public void stop()
{
    mState = State.STOPPED;
    mNanosecs += System.nanoTime() - mStartedAt;
}

/**
 * Dump the total time, total number of starts and stops, and average run time of the
 * timer to an output stream.
 * @param out output stream to write info to.
 */
public void print(PrintStream out)
{
    if (mStarts == 0) {
        out.println(mName + " never started.");
        return;
    }
    
    if (mState == State.RUNNING) out.print("WARNING:  timer still running!  ");
    out.print(mName + ": ");
    double t = mNanosecs / 1000000000.0;
    out.print(t);
    out.print(".  Run ");
    out.print(mStarts);
    out.print(" times, average run time ");
    long avg = mNanosecs / mStarts;
    t = avg / 1000000000.0;
    out.print(t);
    out.println(".");
}

/**
 * @param name Name of this timer.
 */
PerformanceTimer(String name)
{
    mNanosecs = 0;
    mStarts = 0;
    mName = name;
    mState = State.STOPPED;
}


private enum State { RUNNING, STOPPED };

private State mState;
private long mNanosecs;
private long mStartedAt;
private int mStarts;
private String mName;

}
