/**
* 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.
*/
package org.apache.mahout.common;
import java.io.Serializable;
public final class TimingStatistics implements Serializable {
private int nCalls;
private long minTime;
private long maxTime;
private long sumTime;
private double sumSquaredTime;
/** Creates a new instance of CallStats */
public TimingStatistics() { }
public TimingStatistics(int nCalls, long minTime, long maxTime, long sumTime, double sumSquaredTime) {
this.nCalls = nCalls;
this.minTime = minTime;
this.maxTime = maxTime;
this.sumTime = sumTime;
this.sumSquaredTime = sumSquaredTime;
}
public synchronized int getNCalls() {
return nCalls;
}
public synchronized long getMinTime() {
return Math.max(0, minTime);
}
public synchronized long getMaxTime() {
return maxTime;
}
public synchronized long getSumTime() {
return sumTime;
}
public synchronized double getSumSquaredTime() {
return sumSquaredTime;
}
public synchronized long getMeanTime() {
return nCalls == 0 ? 0 : sumTime / nCalls;
}
public synchronized long getStdDevTime() {
if (nCalls == 0) {
return 0;
}
double mean = getMeanTime();
double meanSquared = mean * mean;
double meanOfSquares = sumSquaredTime / nCalls;
double variance = meanOfSquares - meanSquared;
if (variance < 0) {
return 0; // might happen due to rounding error
}
return (long) Math.sqrt(variance);
}
@Override
public synchronized String toString() {
return '\n' + "nCalls = " + nCalls + ";\n" + "sum = " + sumTime / 1000000000.0 + "s;\n"
+ "min = " + minTime / 1000000.0 + "ms;\n" + "max = " + maxTime / 1000000.0 + "ms;\n"
+ "mean = " + getMeanTime() / 1000000.0 + "ms;\n" + "stdDev = " + getStdDevTime()
/ 1000000.0 + "ms;";
}
public Call newCall() {
return new Call();
}
public final class Call {
private final long startTime = System.nanoTime();
private Call() { }
public void end() {
long elapsed = System.nanoTime() - startTime;
synchronized (TimingStatistics.this) {
nCalls++;
if (elapsed < minTime || nCalls == 1) {
minTime = elapsed;
}
if (elapsed > maxTime) {
maxTime = elapsed;
}
sumTime += elapsed;
sumSquaredTime += elapsed * elapsed;
}
}
}
}