import java.util.HashMap; import java.util.logging.Logger; public class Profiler { public static Logger _log = Logger.getLogger(Profiler.class.getName()); private static Profiler _instance; private static String IDENT = " "; private HashMap _profiles = new HashMap(); protected int _numProfileSamples = 10; protected class Profile { private String _name; private long _time; private int _numTest; private long[] _tests = new long[_numProfileSamples]; public Profile(String name) { _name = name; } public void setTime(long time) { _time = time; } public long getTime() { return _time; } public String getName() { return _name; } public void addResult(long value) { _tests[_numTest] = value; _numTest++; } public int getNumTest() { return _numTest; } public long[] getTests() { return _tests; } } public static Profiler getInstance() { if (_instance == null) { _instance = new Profiler(); } return _instance; } public void startProfile(String name) { int hashCode = name.hashCode(); Profile profile = _profiles.get(hashCode); if (profile != null) { if (profile.getNumTest() >= _numProfileSamples) return; } else { profile = new Profile(name); _profiles.put(hashCode,profile); } profile.setTime(System.currentTimeMillis()); } public void endProfile(String name) { int hashCode = name.hashCode(); Profile profile = _profiles.get(hashCode); if (profile == null) { _log.warning("The profile cannot end because not exists:" + name); return; } if (profile.getNumTest() >= _numProfileSamples) return; profile.addResult(System.currentTimeMillis() - profile.getTime()); } public String getDumpProfile() { String content; content = " AVE | Min | Max | # | Profile name\n" + "-------------------------------------------------------------\n"; float ave; long min,max; String temp; long[] tests; for (Profile profile : _profiles.values()) { ave = 0; min = Integer.MAX_VALUE; max = Integer.MIN_VALUE; tests = profile.getTests(); //calculate the average, min and max for (int i = 0; i < tests.length;i++) { ave += tests[i]; if (tests[i] < min) min = tests[i]; if (tests[i] > max) max = tests[i]; } ave /= tests.length; //Generate the line temp = String.format("%.3f",ave/1000f); temp = IDENT.substring(0,IDENT.length() - temp.length()) + temp; content += temp + " |"; temp = String.format("%.3f",min/1000f); temp = IDENT.substring(0,IDENT.length() - temp.length()) + temp; content += temp + " |"; temp = String.format("%.3f",max/1000f); temp = IDENT.substring(0,IDENT.length() - temp.length()) + temp; content += temp + " |"; temp = String.valueOf(profile.getNumTest()); temp = IDENT.substring(0,IDENT.length() - temp.length() - 4) + temp; content += temp + " |"; content += " " + profile.getName() + "\n"; } return content; } public void Initializate() { _profiles.clear(); } public void Initializate(long miliseconds) { } }