Revision: 8787
Author: [email protected]
Date: Wed Sep 15 10:32:35 2010
Log: Fixes speedTracerLogger.markTimline call, updates statistics to
capture the time used by JavaScript optimizers.

Review at http://gwt-code-reviews.appspot.com/882801

http://code.google.com/p/google-web-toolkit/source/detail?r=8787

Modified:
 /trunk/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
 /trunk/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java
 /trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
 /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/BuildTypeMap.java
 /trunk/dev/core/src/com/google/gwt/dev/js/JsInliner.java
 /trunk/dev/core/src/com/google/gwt/dev/js/JsStaticEval.java
 /trunk/dev/core/src/com/google/gwt/dev/js/JsUnusedFunctionRemover.java
/trunk/dev/core/src/com/google/gwt/dev/util/log/speedtracer/CompilerEventType.java /trunk/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java /trunk/dev/core/test/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLoggerTest.java

=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java Mon Aug 30 09:54:26 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java Wed Sep 15 10:32:35 2010
@@ -612,7 +612,7 @@
     }

     Event jdtCompilerEvent = SpeedTracerLogger.start(
-        CompilerEventType.JDT_COMPILER, "phase", "compile");
+        CompilerEventType.JDT_COMPILER2, "phase", "compile");
     compilerImpl = new CompilerImpl();
     compilerImpl.compile(icus.toArray(new ICompilationUnit[icus.size()]));
     compilerImpl = null;
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java Thu Sep 2 05:59:40 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java Wed Sep 15 10:32:35 2010
@@ -170,7 +170,8 @@

       @Override
       public void compile(ICompilationUnit[] sourceUnits) {
- SpeedTracerLogger.Event compileEvent = SpeedTracerLogger.start(CompilerEventType.JDT_COMPILER);
+        SpeedTracerLogger.Event compileEvent = SpeedTracerLogger.start(
+            CompilerEventType.JDT_COMPILER3);
         super.compile(sourceUnits);
         compileEvent.end();
         cuds = null;
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java Fri Sep 10 06:27:47 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java Wed Sep 15 10:32:35 2010
@@ -312,20 +312,7 @@

       // (9) Optimize the JS AST.
       if (!options.isDraftCompile()) {
-        boolean didChange;
-        do {
-          if (Thread.interrupted()) {
-            throw new InterruptedException();
-          }
-
-          didChange = false;
-          // Remove unused functions, possible
-          didChange = JsStaticEval.exec(jsProgram) || didChange;
-          // Inline JavaScript function invocations
-          didChange = JsInliner.exec(jsProgram) || didChange;
-          // Remove unused functions, possible
-          didChange = JsUnusedFunctionRemover.exec(jsProgram) || didChange;
-        } while (didChange);
+        optimizeJs(jsProgram);
       }

       /*
@@ -665,7 +652,7 @@
   }

   protected static void optimize(JJSOptions options, JProgram jprogram)
-      throws InterruptedException {
+  throws InterruptedException {
Event optimizeEvent = SpeedTracerLogger.start(CompilerEventType.OPTIMIZE);

     /*
@@ -697,6 +684,9 @@
     }

     if (JProgram.isTracingEnabled()) {
+      System.out.println("");
+      System.out.println("                Java Optimization Stats");
+      System.out.println("");
       for (OptimizerStats stats : allOptimizerStats) {
         System.out.println(stats.prettyPrint());
       }
@@ -704,6 +694,45 @@

     optimizeEvent.end();
   }
+
+ protected static void optimizeJs(JsProgram jsProgram) throws InterruptedException { + List<OptimizerStats> allOptimizerStats = new ArrayList<OptimizerStats>();
+    int counter = 0;
+    while (true) {
+      counter++;
+      if (Thread.interrupted()) {
+        throw new InterruptedException();
+      }
+ Event optimizeJsEvent = SpeedTracerLogger.start(CompilerEventType.OPTIMIZE_JS);
+
+      OptimizerStats stats = new OptimizerStats("Pass " + counter);
+
+      // Remove unused functions, possible
+      stats.add(JsStaticEval.exec(jsProgram));
+      // Inline JavaScript function invocations
+      stats.add(JsInliner.exec(jsProgram));
+      // Remove unused functions, possible
+      stats.add(JsUnusedFunctionRemover.exec(jsProgram));
+
+      // Save the stats to print out after optimizers finish.
+      allOptimizerStats.add(stats);
+
+      optimizeJsEvent.end();
+
+      if (!stats.didChange()) {
+        break;
+      }
+    }
+
+    if (JProgram.isTracingEnabled()) {
+      System.out.println("");
+      System.out.println("               JavaScript Optimization Stats");
+      System.out.println("");
+      for (OptimizerStats stats : allOptimizerStats) {
+        System.out.println(stats.prettyPrint());
+      }
+    }
+  }

protected static OptimizerStats optimizeLoop(String passName, JProgram jprogram,
       boolean isAggressivelyOptimize) {
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/BuildTypeMap.java Mon Aug 16 15:00:16 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/BuildTypeMap.java Wed Sep 15 10:32:35 2010
@@ -533,7 +533,7 @@
       CompilationResults results, JsProgram jsProgram, TypeLinker linker) {
     BuildTypeMap btm = new BuildTypeMap(typeMap, jsProgram, linker,
         results.compiledUnits);
- Event buildTypeMapEvent = SpeedTracerLogger.start(CompilerEventType.BUILD_TYPE_MAP); + Event buildTypeMapEvent = SpeedTracerLogger.start(CompilerEventType.BUILD_TYPE_MAP_FOR_AST);
     btm.createPeersForUnits();
     btm.resolveExternalTypes(results.binaryBindings);
     TypeDeclaration[] result = btm.createPeersForNonTypeDecls();
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/js/JsInliner.java Tue Apr 13 07:20:13 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/js/JsInliner.java Wed Sep 15 10:32:35 2010
@@ -18,6 +18,7 @@
 import com.google.gwt.dev.jjs.HasSourceInfo;
 import com.google.gwt.dev.jjs.InternalCompilerException;
 import com.google.gwt.dev.jjs.SourceInfo;
+import com.google.gwt.dev.jjs.impl.OptimizerStats;
 import com.google.gwt.dev.js.ast.JsArrayAccess;
 import com.google.gwt.dev.js.ast.JsArrayLiteral;
 import com.google.gwt.dev.js.ast.JsBinaryOperation;
@@ -56,9 +57,12 @@
 import com.google.gwt.dev.js.ast.JsSwitchMember;
 import com.google.gwt.dev.js.ast.JsThisRef;
 import com.google.gwt.dev.js.ast.JsVars;
+import com.google.gwt.dev.js.ast.JsVars.JsVar;
 import com.google.gwt.dev.js.ast.JsVisitor;
 import com.google.gwt.dev.js.ast.JsWhile;
-import com.google.gwt.dev.js.ast.JsVars.JsVar;
+import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
+import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
+import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;

 import java.util.ArrayList;
 import java.util.Collection;
@@ -79,6 +83,7 @@
  * migrate other stuff to that class perhaps.
  */
 public class JsInliner {
+  private static final String NAME = JsInliner.class.getSimpleName();

   /**
* Determines if the evaluation of a JsNode may be affected by side effects.
@@ -1613,22 +1618,12 @@
   /**
    * Static entry point used by JavaToJavaScriptCompiler.
    */
-  public static boolean exec(JsProgram program) {
-    RedefinedFunctionCollector d = new RedefinedFunctionCollector();
-    d.accept(program);
-
-    RecursionCollector rc = new RecursionCollector();
-    rc.accept(program);
-
-    InliningVisitor v = new InliningVisitor(program);
-    v.blacklist(d.getRedefined());
-    v.blacklist(rc.getRecursive());
-    v.accept(program);
-
-    DuplicateXORemover r = new DuplicateXORemover(program);
-    r.accept(program);
-
-    return v.didChange() || r.didChange();
+  public static OptimizerStats exec(JsProgram program) {
+ Event optimizeJsEvent = SpeedTracerLogger.start(CompilerEventType.OPTIMIZE_JS,
+        "optimizer", NAME);
+    OptimizerStats stats = execImpl(program);
+    optimizeJsEvent.end("didChange", "" + stats.didChange());
+    return stats;
   }

   /**
@@ -1669,6 +1664,34 @@
     v.accept(func.getBody());
     return v.containsNestedFunctions();
   }
+
+  /**
+   * @param program
+   * @return
+   */
+  private static OptimizerStats execImpl(JsProgram program) {
+    OptimizerStats stats = new OptimizerStats(NAME);
+    RedefinedFunctionCollector d = new RedefinedFunctionCollector();
+    d.accept(program);
+
+    RecursionCollector rc = new RecursionCollector();
+    rc.accept(program);
+
+    InliningVisitor v = new InliningVisitor(program);
+    v.blacklist(d.getRedefined());
+    v.blacklist(rc.getRecursive());
+    v.accept(program);
+    if (v.didChange()) {
+      stats.recordModified();
+    }
+
+    DuplicateXORemover r = new DuplicateXORemover(program);
+    r.accept(program);
+    if (r.didChange()) {
+      stats.recordModified();
+    }
+    return stats;
+  }

   /**
    * Check to see if the to-be-inlined statement shares any idents with the
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/js/JsStaticEval.java Tue Jun 22 06:26:45 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/js/JsStaticEval.java Wed Sep 15 10:32:35 2010
@@ -17,6 +17,7 @@

 import com.google.gwt.dev.jjs.HasSourceInfo;
 import com.google.gwt.dev.jjs.SourceInfo;
+import com.google.gwt.dev.jjs.impl.OptimizerStats;
 import com.google.gwt.dev.js.ast.CanBooleanEval;
 import com.google.gwt.dev.js.ast.JsBinaryOperation;
 import com.google.gwt.dev.js.ast.JsBinaryOperator;
@@ -43,10 +44,13 @@
 import com.google.gwt.dev.js.ast.JsUnaryOperator;
 import com.google.gwt.dev.js.ast.JsValueLiteral;
 import com.google.gwt.dev.js.ast.JsVars;
+import com.google.gwt.dev.js.ast.JsVars.JsVar;
 import com.google.gwt.dev.js.ast.JsVisitable;
 import com.google.gwt.dev.js.ast.JsVisitor;
 import com.google.gwt.dev.js.ast.JsWhile;
-import com.google.gwt.dev.js.ast.JsVars.JsVar;
+import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
+import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
+import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;

 import java.util.ArrayList;
 import java.util.EnumSet;
@@ -60,7 +64,6 @@
  * Removes JsFunctions that are never referenced in the program.
  */
 public class JsStaticEval {
-
   /**
    * Examines code to find out whether it contains any break or continue
    * statements.
@@ -817,6 +820,8 @@
       }
     }
   }
+
+  private static final String NAME = JsStaticEval.class.getSimpleName();

   /**
* A set of the JS operators that are mathematically associative in nature.
@@ -826,13 +831,21 @@
       JsBinaryOperator.BIT_OR, JsBinaryOperator.BIT_XOR,
       JsBinaryOperator.COMMA, JsBinaryOperator.MUL, JsBinaryOperator.OR);

-  public static boolean exec(JsProgram program) {
-    return (new JsStaticEval(program)).execImpl();
-  }
-
   @SuppressWarnings("unchecked")
   public static <T extends JsVisitable> T exec(JsProgram program, T node) {
-    return (new JsStaticEval(program)).execImpl(node);
+ Event optimizeJsEvent = SpeedTracerLogger.start(CompilerEventType.OPTIMIZE_JS,
+        "optimizer", NAME);
+    T result = new JsStaticEval(program).execImpl(node);
+    optimizeJsEvent.end();
+    return result;
+  }
+
+  public static OptimizerStats exec(JsProgram program) {
+ Event optimizeJsEvent = SpeedTracerLogger.start(CompilerEventType.OPTIMIZE_JS,
+        "optimizer", NAME);
+    OptimizerStats stats = new JsStaticEval(program).execImpl();
+    optimizeJsEvent.end("didChange", "" + stats.didChange());
+    return stats;
   }

   /**
@@ -932,16 +945,19 @@
   public JsStaticEval(JsProgram program) {
     this.program = program;
   }
-
-  public boolean execImpl() {
-    StaticEvalVisitor sev = new StaticEvalVisitor();
-    sev.accept(program);
-
-    return sev.didChange();
-  }

   @SuppressWarnings("unchecked")
   public <T extends JsVisitable> T execImpl(T node) {
     return new StaticEvalVisitor().accept(node);
   }
-}
+
+  public OptimizerStats execImpl() {
+    StaticEvalVisitor sev = new StaticEvalVisitor();
+    sev.accept(program);
+    OptimizerStats stats = new OptimizerStats(NAME);
+    if (sev.didChange()) {
+      stats.recordModified();
+    }
+    return stats;
+  }
+}
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/js/JsUnusedFunctionRemover.java Mon Jul 6 14:45:31 2009 +++ /trunk/dev/core/src/com/google/gwt/dev/js/JsUnusedFunctionRemover.java Wed Sep 15 10:32:35 2010
@@ -16,6 +16,7 @@
 package com.google.gwt.dev.js;

 import com.google.gwt.dev.jjs.InternalCompilerException;
+import com.google.gwt.dev.jjs.impl.OptimizerStats;
 import com.google.gwt.dev.js.ast.JsContext;
 import com.google.gwt.dev.js.ast.JsExprStmt;
 import com.google.gwt.dev.js.ast.JsExpression;
@@ -26,6 +27,9 @@
 import com.google.gwt.dev.js.ast.JsProgram;
 import com.google.gwt.dev.js.ast.JsStatement;
 import com.google.gwt.dev.js.ast.JsVisitor;
+import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
+import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
+import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;

 import java.util.HashMap;
 import java.util.Map;
@@ -34,6 +38,7 @@
  * Removes JsFunctions that are never referenced in the program.
  */
 public class JsUnusedFunctionRemover {
+ public static final String NAME = JsUnusedFunctionRemover.class.getSimpleName();

   /**
    * Finds all functions in the program.
@@ -90,8 +95,12 @@
     }
   }

-  public static boolean exec(JsProgram program) {
-    return (new JsUnusedFunctionRemover(program)).execImpl();
+  public static OptimizerStats exec(JsProgram program) {
+ Event optimizeJsEvent = SpeedTracerLogger.start(CompilerEventType.OPTIMIZE_JS,
+        "optimizer", NAME);
+    OptimizerStats stats = new JsUnusedFunctionRemover(program).execImpl();
+    optimizeJsEvent.end("didChange", "" + stats.didChange());
+    return stats;
   }

private final Map<JsName, JsFunction> toRemove = new HashMap<JsName, JsFunction>();
@@ -101,7 +110,9 @@
     this.program = program;
   }

-  public boolean execImpl() {
+  public OptimizerStats execImpl() {
+    OptimizerStats stats = new OptimizerStats(NAME);
+
     // Find all functions
     (new JsFunctionVisitor()).accept(program);

@@ -112,6 +123,9 @@
     RemovalVisitor removalVisitor = new RemovalVisitor();
     removalVisitor.accept(program);

-    return removalVisitor.didChange();
+    if (removalVisitor.didChange()) {
+      stats.recordModified();
+    }
+    return stats;
   }
 }
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/util/log/speedtracer/CompilerEventType.java Wed Aug 18 11:56:28 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/util/log/speedtracer/CompilerEventType.java Wed Sep 15 10:32:35 2010
@@ -28,11 +28,14 @@
   JJS_COMPILE_PERMUTATION("JjsCompilePermutation", "Moccasin"), //
   DRAFT_OPTIMIZE("DraftOptimizer", "Blue"), //
   GENERATOR("Generator", "Red"), //
-  JDT_COMPILER("JdtCompiler", "Tomato"), //
+  JDT_COMPILER("JdtCompiler1", "#6c6"), //
+  JDT_COMPILER2("JdtCompiler2", "#0c0"), //
+  JDT_COMPILER3("JdtCompiler3", "#494"), //
   LINK("Link", "LawnGreen"), //
   MAKE_SOYC_ARTIFACTS("MakeSoycArtifacts", "Chartreuse"), //
   MODULE_DEF("ModuleDef", "BlueViolet"), //
   OPTIMIZE("Optimize", "LightSlateGray"), //
+  OPTIMIZE_JS("OptimizeJs", "#8b8bab"), //
   PRECOMPILE("Precompile", "CornflowerBlue"), //
   RESOURCE_ORACLE("ResourceOracle", "GoldenRod"), //
   TYPE_ORACLE_MEDIATOR("TypeOracleMediator", "LightSteelBlue"), //
@@ -47,7 +50,7 @@
   VALIDATE("Validate", "YellowGreen"), //
   NORMALIZER("Normalizer", "Peru"), //
   RECORD_REBINDS("RecordRebinds", "Chocolate"), //
-  BUILD_TYPE_MAP("BuildTypeMap", "LightSeaGreen"), //
+  BUILD_TYPE_MAP_FOR_AST("BuildTypeMapForAST", "LightSeaGreen"), //
   GET_COMPILATION_UNITS("GetCompilationUnitDeclarations", "Gainsboro"), //
   GENERATE_JAVA_AST("GenerateJavaAST", "DodgerBlue"),
   ARTIFICIAL_RESCUE_REORDER("ArtificialRescueReorder", "LightCyan"), //
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java Wed Aug 25 08:20:08 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java Wed Sep 15 10:32:35 2010
@@ -274,8 +274,8 @@
* Adds a LOG_MESSAGE SpeedTracer event to the log. This represents a single
    * point in time and has a special representation in the SpeedTracer UI.
    */
-  public static void markTimeline(String... data) {
-    SpeedTracerLogger.get().markTimelineImpl(data);
+  public static void markTimeline(String message) {
+    SpeedTracerLogger.get().markTimelineImpl(message);
   }

   /**
@@ -366,7 +366,7 @@
     currentEvent.addData(data);
   }

-  public void markTimelineImpl(String... data) {
+  public void markTimelineImpl(String message) {
     Stack<Event> threadPendingEvents = pendingEvents.get();
     Event parent = null;
     if (!threadPendingEvents.isEmpty()) {
@@ -374,7 +374,7 @@
     }
     Event newEvent = new MarkTimelineEvent(parent);
     threadPendingEvents.push(newEvent);
-    newEvent.end(data);
+    newEvent.end("message", message);
   }

   void endImpl(Event event, String... data) {
=======================================
--- /trunk/dev/core/test/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLoggerTest.java Wed Aug 18 11:56:28 2010 +++ /trunk/dev/core/test/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLoggerTest.java Wed Sep 15 10:32:35 2010
@@ -200,7 +200,7 @@
    Writer writer = new StringWriter();
     SpeedTracerLogger logger = new SpeedTracerLogger(writer, Format.RAW);
     Event dummyOneEvent = logger.startImpl(dummyOne);
-    logger.markTimelineImpl("name", "value");
+    logger.markTimelineImpl("Test Message");
     dummyOneEvent.end();
     logger.flush();

@@ -214,7 +214,8 @@
     JsonObject markTimelineObject = children.get(0).asObject();
assertEquals(11.0, markTimelineObject.get("type").asNumber().getDecimal(), .001);
     JsonObject dataObject = markTimelineObject.get("data").asObject();
- assertEquals("json=" + logString, "value", dataObject.get("name").asString().getString());
+    assertEquals("json=" + logString, "Test Message",
+        dataObject.get("message").asString().getString());
   }


--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to