/* This file is part of jpcsp. Jpcsp is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Jpcsp 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 for more details. You should have received a copy of the GNU General Public License along with Jpcsp. If not, see <http://www.gnu.org/licenses/>. */ package jpcsp.util; public class DurationStatistics implements Comparable<DurationStatistics> { public static final boolean collectStatistics = false; public String name; public long cumulatedTimeMillis; public long numberCalls; private long startTimeMillis; private long maxTimeMillis; public DurationStatistics() { reset(); } public DurationStatistics(String name) { this.name = name; reset(); } public void start() { if (!collectStatistics) { return; } startTimeMillis = System.currentTimeMillis(); } public void end() { if (!collectStatistics) { return; } long duration = getDurationMillis(); cumulatedTimeMillis += duration; numberCalls++; maxTimeMillis = Math.max(maxTimeMillis, duration); } public long getDurationMillis() { return System.currentTimeMillis() - startTimeMillis; } public void add(DurationStatistics durationStatistics) { cumulatedTimeMillis += durationStatistics.cumulatedTimeMillis; numberCalls += durationStatistics.numberCalls; maxTimeMillis = Math.max(maxTimeMillis, durationStatistics.maxTimeMillis); } public void reset() { cumulatedTimeMillis = 0; numberCalls = 0; startTimeMillis = 0; maxTimeMillis = 0; } @Override public String toString() { StringBuilder result = new StringBuilder(); if (name != null) { result.append(name); result.append(": "); } if (!collectStatistics) { result.append("Statistics disabled"); } else { result.append(numberCalls); result.append(" calls"); if (numberCalls > 0) { result.append(" in "); result.append(String.format("%.3fs", cumulatedTimeMillis / 1000.0)); result.append(" (avg="); double average = cumulatedTimeMillis / (1000.0 * numberCalls); if (average < 0.000001) { result.append(String.format("%.3fus", average * 1000000)); } else if (average < 0.001) { result.append(String.format("%.3fms", average * 1000)); } else { result.append(String.format("%.3fs", average)); } result.append(String.format(", max=%dms", maxTimeMillis)); result.append(")"); } } return result.toString(); } @Override public int compareTo(DurationStatistics o) { if (cumulatedTimeMillis < o.cumulatedTimeMillis) { return 1; } else if (cumulatedTimeMillis > o.cumulatedTimeMillis) { return -1; } else if (numberCalls < o.numberCalls) { return 1; } else if (numberCalls > o.numberCalls) { return -1; } return 0; } }