/* * Profiler.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.inference.markovchain; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * @author Andrew Rambaut * * @version $Id: Profiler.java,v 1.3 2004/12/16 10:25:01 alexei Exp $ */ public class Profiler { private static boolean profilerAvailable = true; private static Map<String, Profile> profiles = new HashMap<String, Profile>(); //private static String currentProfile = null; private static long startTime; public static boolean startProfile() { //String name) { if (profilerAvailable) { //@todo unfortunately I can't get my Ant Build to work with asserts yet. Help! //assert currentProfile == null : "Profile " + currentProfile + " is already recording"; //currentProfile = name; startTime = getCurrentThreadCpuTime(); } return true; } public static boolean stopProfile(String name) { if (profilerAvailable) { long stopTime = getCurrentThreadCpuTime(); //@todo unfortunately I can't get my Ant Build to work with asserts yet. Help! //assert name.equals(currentProfile) : "Profile " + name + " is not recording"; long count = 1; long totalTime = stopTime - startTime; Profile profile = profiles.get(name); if (profile != null) { totalTime += profile.time; count += profile.count; } profiles.put(name, new Profile(count, totalTime)); //currentProfile = null; } return true; } public static void report() { if (profilerAvailable) { Iterator<String> iter = profiles.keySet().iterator(); while (iter.hasNext()) { String name = iter.next(); Profile profile = profiles.get(name); long average = profile.time / profile.count; System.err.println("PROFILE: " + name + " [" + profile.time + " ms, " + profile.count + " calls, " + average + " ms / call]"); } } } private static class Profile { long time; long count; Profile(long count, long time) { this.count = count; this.time = time; } } public static native long getCurrentThreadCpuTime(); static { try { System.loadLibrary("mcmcprof"); } catch (UnsatisfiedLinkError ule) { profilerAvailable = false; } } }