diff --git a/prism/src/common/StopWatch.java b/prism/src/common/StopWatch.java new file mode 100644 index 00000000..4a3931a1 --- /dev/null +++ b/prism/src/common/StopWatch.java @@ -0,0 +1,214 @@ +//============================================================================== +// +// Copyright (c) 2015- +// Authors: +// * Joachim Klein (TU Dresden) +// * Steffen Maercker (TU Dresden) +// +//------------------------------------------------------------------------------ +// +// This file is part of PRISM. +// +// PRISM 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 2 of the License, or +// (at your option) any later version. +// +// PRISM 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 PRISM; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +//============================================================================== + +package common; + +import java.util.function.Function; +import java.util.function.Supplier; + +import prism.PrismLog; + +/** + * Stop watch for keeping track of the runtime of some computation, + * optionally printing the elapsed time to the log after the computation + * has stopped. + *
+ * Example usage: + *
+ * StopWatch timer = new StopWatch(log);
+ * timer.start("model checking");
+ * // ... do the actual computation ...
+ * timer.stop();
+ * 
+ * would result in the output + *
+ * Time for model checking 42.00 seconds.
+ * 
+ *
+ * Stopping via + *
+ * timer.stop("result was xyz");
+ * 
+ * results in + *
+ * Time for model checking 42.00 seconds, result was xyz.
+ * 
+ */ +public class StopWatch +{ + /** The (optional) log */ + protected PrismLog log; + + /** An (optional) task description */ + protected String taskDescription; + + /** For storing the time */ + protected long time = 0; + + /** Is watch running? */ + protected boolean running = false; + + /** Constructor, no log and no output */ + public StopWatch() + { + } + + /** Constructor, stores log for output */ + public StopWatch(PrismLog log) + { + this.log = log; + } + + /** Start the stop watch (without task description) */ + public void start() + { + start(null); + } + + /** Start the stop watch, store task description (may be {@code null}) */ + public void start(String taskDescription) + { + this.taskDescription = taskDescription; + running = true; + time = System.currentTimeMillis(); + } + + /** + * Stop the stop watch. + * If a task description and a log was given, output elapsed time. + * @return elapsed time in milliseconds + */ + public long stop() + { + return stop(null); + } + + /** + * Stop the stop watch, optionally taking extra text for output. + * If a log and a task description / extra text was given, output + * elapsed time. + *
+ * Extra text is output as "... xx.yy seconds, extra-text." + * @param extraText extra text to output (optional, ignored if {@code null}) + */ + public long stop(String extraText) + { + time = System.currentTimeMillis() - time; + running = false; + if (log != null) { + if (taskDescription != null) { + log.print("Time for " + taskDescription + ": " + elapsedSeconds() + " seconds"); + if (extraText != null) { + log.print(", " + extraText); + } + log.println("."); + } else if (extraText != null) { + log.println("Time: " + elapsedSeconds() + " seconds, " + extraText + "."); + } + } + return time; + } + + /** Get the number of elapsed milliseconds (fixed value after having called stop). */ + public long elapsedMillis() + { + return running ? System.currentTimeMillis() - time : time; + } + + /** Get the number of elapsed seconds (fixed value after having called stop). */ + public double elapsedSeconds() + { + return elapsedMillis() / 1000.0; + } + + /** + * Stop the execution time of a task. + * + * @return time in milliseconds + **/ + public long run(Runnable task) + { + return run(task, null, null); + } + + /** + * Stop the execution time of a task. + * + * @param taskDescription description or {@code null}) + * @param extraText text or {@code null} + * @return time in milliseconds + **/ + public long run(Runnable task, String taskDescription, String extraText) + { + start(taskDescription); + task.run(); + return stop(extraText); + } + + /** + * Stop the execution time of a task and return the result. + * Time is available via {@code elapsedMillis()} and {@code elapsedSeconds()}. + * + * @return task result + **/ + public T run(Supplier task) + { + return run(task, null, (String) null); + } + + /** + * Stop the execution time of a task and return the result. + * Time is available via {@code elapsedMillis()} and {@code elapsedSeconds()}. + * + * @param taskDescription description or {@code null} + * @param extraText text or {@code null} + * @return task result + **/ + public T run(Supplier task, String taskDescription, String extraText) + { + start(taskDescription); + T result = task.get(); + stop(extraText); + return result; + } + + /** + * Stop the execution time of a task and return the result. + * Time is available via {@code elapsedMillis()} and {@code elapsedSeconds()}. + * + * @param taskDescription description or {@code null} + * @param resultDescription function that provides a description or {@code null} + * @return task result + **/ + public T run(Supplier task, String taskDescription, Function resultDescription) + { + start(taskDescription); + T result = task.get(); + stop(resultDescription.apply(result)); + return result; + } +}