Only export statistics(runtime,_) for STATISTICS_RUNTIME This avoids the need to access the system clock during initialization of an interpreter, and prevents code from getting the difference in wall clock time during execution.
diff --git a/src/builtin/PRED_$statistics_2.java b/src/builtin/PRED_$statistics_2.java index a0753ac..ab1778f 100644 --- a/src/builtin/PRED_$statistics_2.java +++ b/src/builtin/PRED_$statistics_2.java
@@ -31,6 +31,7 @@ } else if (! a1.isSymbol()) { throw new IllegalTypeException(this, 1, "atom", a1); } else if (a1.equals(SYM_RUNTIME)) { + engine.requireFeature(Prolog.Feature.STATISTICS_RUNTIME, this, a1); long val1, val2; Term start, previous; val1 = System.currentTimeMillis() - engine.getStartRuntime();
diff --git a/src/lang/Prolog.java b/src/lang/Prolog.java index 222e37a..1e5d7a2 100644 --- a/src/lang/Prolog.java +++ b/src/lang/Prolog.java
@@ -156,7 +156,10 @@ JAVA_REFLECTION, /** Access to the local filesystem and console. */ - IO; + IO, + + /** Track the running time of evaluations */ + STATISTICS_RUNTIME; } protected final EnumSet<Feature> features = EnumSet.allOf(Feature.class); @@ -251,8 +254,10 @@ doubleQuotes = "codes"; printStackTrace = "off"; - exception = NONE; - startRuntime = System.currentTimeMillis(); + exception = NONE; + startRuntime = features.contains(Feature.STATISTICS_RUNTIME) + ? System.currentTimeMillis() + : 0; previousRuntime = 0; userOutput.flush();