package games.strategy.performance;
import java.io.Closeable;
import java.util.prefs.Preferences;
/**
* Provides a high level API to the game engine for performance measurements.
* This class handles the library details and sends output to 'PerformanceConsole.java'
*/
public class PerfTimer implements Closeable {
private static final String LOG_PERFORMANCE_KEY = "logPerformance";
private static final PerfTimer DISABLED_TIMER = new PerfTimer("disabled");
private static boolean enabled;
private final long startMillis;
public final String title;
static {
enabled = isEnabled();
if (enabled) {
PerformanceConsole.getInstance().setVisible(true);
}
}
private PerfTimer(final String title) {
this.title = title;
this.startMillis = System.nanoTime();
}
private long stopTimer() {
return System.nanoTime() - startMillis;
}
@Override
public void close() {
processResult(stopTimer(), this);
}
public static void setEnabled(final boolean isEnabled) {
if (enabled != isEnabled) {
enabled = isEnabled;
PerformanceConsole.getInstance().setVisible(enabled);
storeEnabledPreference();
}
}
private static void storeEnabledPreference() {
final Preferences prefs = Preferences.userNodeForPackage(EnablePerformanceLoggingCheckBox.class);
prefs.put(LOG_PERFORMANCE_KEY, Boolean.valueOf(enabled).toString());
}
public static boolean isEnabled() {
final Preferences prefs = Preferences.userNodeForPackage(EnablePerformanceLoggingCheckBox.class);
return prefs.getBoolean(LOG_PERFORMANCE_KEY, false);
}
public static PerfTimer startTimer(final String title) {
return enabled ? new PerfTimer(title) : DISABLED_TIMER;
}
private static void processResult(final long stopNanos, final PerfTimer perfTimer) {
final long stopMicros = stopNanos / 1000;
final long milliFraction = (stopMicros % 1000) / 100;
final long millis = (stopMicros / 1000);
PerformanceConsole.getInstance().append(millis + "." + milliFraction + " ms - " + perfTimer.title + "\n");
}
}