big speed improvement (observable when beautify = false)
authorMihai Bazon <mihai@bazon.net>
Fri, 17 Aug 2012 16:04:23 +0000 (19:04 +0300)
committerMihai Bazon <mihai@bazon.net>
Fri, 17 Aug 2012 16:04:23 +0000 (19:04 +0300)
who would have thought that str.charAt(str.length - 1) is not a constant,
instant operation?  seems to get slower and slower as the string grows.

0.6s vs. 3s

lib/output.js

index 93aa7f6..12cf104 100644 (file)
@@ -68,22 +68,21 @@ function OutputStream(options) {
         return repeat_string(" ", options.indent_start + indentation - back * options.indent_level);
     };
 
-    function last_char() {
-        return OUTPUT.charAt(OUTPUT.length - 1);
-    };
-
     /* -----[ beautification/minification ]----- */
 
     var might_need_space = false;
     var might_need_semicolon = false;
     var last = null;
 
+    function last_char() {
+        return last.charAt(last.length - 1);
+    };
+
     function print(str) {
-        last = str;
         str = String(str);
         var ch = str.charAt(0);
         if (might_need_semicolon) {
-            if (";}".indexOf(ch) < 0 && !/[;]$/.test(OUTPUT)) {
+            if (";}".indexOf(ch) < 0 && !/[;]$/.test(last)) {
                 OUTPUT += ";";
                 current_col++;
                 current_pos++;
@@ -96,7 +95,7 @@ function OutputStream(options) {
             if ((is_identifier_char(last_char())
                  && (is_identifier_char(ch) || ch == "\\"))
                 ||
-                (/[\+\-]$/.test(OUTPUT) && /^[\+\-]/.test(str)))
+                (/[\+\-]$/.test(last) && /^[\+\-]/.test(str)))
             {
                 OUTPUT += " ";
                 current_col++;
@@ -112,6 +111,7 @@ function OutputStream(options) {
             current_col += a[n - 1].length;
         }
         current_pos += str.length;
+        last = str;
         OUTPUT += str;
     };
 
@@ -682,8 +682,9 @@ function OutputStream(options) {
         output.print("]");
     });
     DEFPRINT(AST_UnaryPrefix, function(self, output){
-        output.print(self.operator);
-        if (is_alphanumeric_char(self.operator.charAt(0)))
+        var op = self.operator;
+        output.print(op);
+        if (/^[a-z]/i.test(op))
             output.space();
         self.expression.print(output);
     });