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