Author: [email protected]
Date: Fri May 15 16:22:51 2009
New Revision: 5402

Modified:
    trunk/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java

Log:
Peephole optimization of SymbolMapsLinker.

Hoist up and reuse a ByteArrayOutputStream and especially StringBuffer.   
This linker has a MUCH better memory/gc profile when we can avoid creating  
tons of temporary buffers over and over.  We also reuse a char[] to  
transfer data from StringBuffer to PrintWriter to avoid having to create  
intermediate Strings.

Review by: spoon, fabbott

Modified:  
trunk/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java  
(original)
+++ trunk/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java Fri  
May 15 16:22:51 2009
@@ -58,14 +58,15 @@

      artifacts = new ArtifactSet(artifacts);

+    ByteArrayOutputStream out = new ByteArrayOutputStream();
      for (CompilationResult result :  
artifacts.find(CompilationResult.class)) {
-      ByteArrayOutputStream out = new ByteArrayOutputStream();
        PrintWriter pw = new PrintWriter(out);

        doWriteSymbolMap(logger, result, pw);
        pw.close();

        doEmitSymbolMap(logger, artifacts, result, out);
+      out.reset();
      }

      return artifacts;
@@ -109,12 +110,16 @@
      }

      pw.println("# jsName, jsniIdent, className, memberName, sourceUri,  
sourceLine");
+    StringBuilder sb = new StringBuilder(1024);
+    char[] buf = new char[1024];
      for (SymbolData symbol : result.getSymbolMap()) {
-      StringBuilder sb = new StringBuilder(1024);
        sb.append(symbol.getSymbolName());

        sb.append(',');
-      sb.append(symbol.getJsniIdent());
+      String jsniIdent = symbol.getJsniIdent();
+      if (jsniIdent != null) {
+        sb.append(jsniIdent);
+      }
        sb.append(',');
        sb.append(symbol.getClassName());
        sb.append(',');
@@ -130,7 +135,18 @@
        sb.append(',');
        sb.append(symbol.getSourceLine());
        sb.append('\n');
-      pw.write(sb.toString());
+
+      int sbLen = sb.length();
+      if (buf.length < sbLen) {
+        int bufLen = buf.length;
+        while (bufLen < sbLen) {
+          bufLen <<= 1;
+        }
+        buf = new char[bufLen];
+      }
+      sb.getChars(0, sbLen, buf, 0);
+      pw.write(buf, 0, sbLen);
+      sb.setLength(0);
      }
    }
  }

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

Reply via email to