view graal/com.oracle.max.base/src/com/sun/max/util/timer/TimerMetric.java @ 4231:d713eaf4d288

Renaming
author Christian Wimmer <Christian.Wimmer@Oracle.com>
date Thu, 05 Jan 2012 16:09:47 -0800
parents e233f5660da4
children
line wrap: on
line source

/*
 * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package com.sun.max.util.timer;

import java.io.*;

import com.sun.max.profile.*;
import com.sun.max.profile.Metrics.*;

/**
 * This class implements a wrapper around a timer that collects statistics about the time intervals recorded.
 */
public class TimerMetric implements Timer, Metric {
    private final Timer timer;

    private int count;
    private long elapsed;
    private long nested;

    public TimerMetric(Timer timer) {
        this.timer = timer;
    }

    public void start() {
        timer.start();
    }

    public void stop() {
        timer.stop();
        synchronized (this) {
            count++;
            elapsed += timer.getLastElapsedTime();
            nested += timer.getLastNestedTime();
        }
    }

    public Clock getClock() {
        return timer.getClock();
    }

    public long getLastElapsedTime() {
        return timer.getLastElapsedTime();
    }

    public long getLastNestedTime() {
        return timer.getLastNestedTime();
    }

    public synchronized void reset() {
        count = 0;
        elapsed = 0;
        nested = 0;
    }

    public long getElapsedTime() {
        return elapsed;
    }

    public long getNestedTime() {
        return nested;
    }

    public int getCount() {
        return count;
    }

    public synchronized void report(String name, PrintStream stream) {
        if (count > 0) {
            final long hz = timer.getClock().getHZ();
            final long total = elapsed - nested;
            if (hz > 0) {
                // report in seconds
                final double secs = total / (double) hz;
                Metrics.report(stream, name, "total", "--", String.valueOf(secs), "seconds");
                Metrics.report(stream, name, "average", "--", String.valueOf(secs / count), "seconds (" + count + " intervals)");
            } else {
                // report in ticks
                Metrics.report(stream, name, "total", "--", String.valueOf(total), "ticks");
                Metrics.report(stream, name, "average", "--", String.valueOf(total / (double) count), "ticks (" + count + " intervals)");
            }
        }
    }
}