Add timing diagnostics to Retrace

Bug: 148690192
Change-Id: I650324730f739b68ae6484a5716b59f732107719
diff --git a/src/main/java/com/android/tools/r8/retrace/Retrace.java b/src/main/java/com/android/tools/r8/retrace/Retrace.java
index 057875d..0edcea8 100644
--- a/src/main/java/com/android/tools/r8/retrace/Retrace.java
+++ b/src/main/java/com/android/tools/r8/retrace/Retrace.java
@@ -16,6 +16,7 @@
 import com.android.tools.r8.utils.OptionsParsing.ParseContext;
 import com.android.tools.r8.utils.StringDiagnostic;
 import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.Timing;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -118,10 +119,14 @@
    */
   public static void run(RetraceCommand command) {
     try {
+      Timing timing = Timing.create("R8 retrace", command.printMemory());
+      timing.begin("Read proguard map");
       ClassNameMapper classNameMapper =
           ClassNameMapper.mapperFromString(command.proguardMapProducer.get());
+      timing.end();
       RetraceBase retraceBase = RetraceBaseImpl.create(classNameMapper);
       RetraceCommandLineResult result;
+      timing.begin("Parse and Retrace");
       if (command.regularExpression != null) {
         result =
             new RetraceRegularExpression(
@@ -136,7 +141,13 @@
                     retraceBase, command.stackTrace, command.diagnosticsHandler, command.isVerbose)
                 .retrace();
       }
+      timing.end();
+      timing.begin("Report result");
       command.retracedStackTraceConsumer.accept(result.getNodes());
+      timing.end();
+      if (command.printTimes()) {
+        timing.report();
+      }
     } catch (IOException ex) {
       command.diagnosticsHandler.error(
           new StringDiagnostic("Could not open mapping input stream: " + ex.getMessage()));
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceCommand.java b/src/main/java/com/android/tools/r8/retrace/RetraceCommand.java
index 93addc4..64cf59a 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceCommand.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceCommand.java
@@ -40,6 +40,14 @@
     assert this.retracedStackTraceConsumer != null;
   }
 
+  public boolean printTimes() {
+    return System.getProperty("com.android.tools.r8.printtimes") != null;
+  }
+
+  public boolean printMemory() {
+    return System.getProperty("com.android.tools.r8.printmemory") != null;
+  }
+
   /**
    * Utility method for obtaining a RetraceCommand builder.
    *
diff --git a/src/main/java/com/android/tools/r8/utils/Timing.java b/src/main/java/com/android/tools/r8/utils/Timing.java
index 78c1b44..5652476 100644
--- a/src/main/java/com/android/tools/r8/utils/Timing.java
+++ b/src/main/java/com/android/tools/r8/utils/Timing.java
@@ -75,6 +75,10 @@
         : Timing.empty();
   }
 
+  public static Timing create(String title, boolean printMemory) {
+    return new Timing(title, printMemory);
+  }
+
   private final Node top;
   private final Stack<Node> stack;
   private final boolean trackMemory;