Title: [184926] trunk/Source/_javascript_Core
Revision
184926
Author
[email protected]
Date
2015-05-27 16:43:22 -0700 (Wed, 27 May 2015)

Log Message

REGRESSION: These sorting idioms used by Peacekeeper and Browsermark are ~20X slower
https://bugs.webkit.org/show_bug.cgi?id=145412

Reviewed by Benjamin Poulain.

Cache strings when doing a string-converting sort.

This is a 21% speedup.

* builtins/Array.prototype.js:
(sort.stringComparator): Use subtraction instead of branching because
it's slightly faster.

(sort.comparatorSort):
(sort.stringSort):
(sort): Add a special case for string sorting to avoid redundant string
conversion.

* parser/Parser.cpp:
(JSC::Parser<LexerType>::createBindingPattern): Names can be empty if
they are private names.

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (184925 => 184926)


--- trunk/Source/_javascript_Core/ChangeLog	2015-05-27 23:21:58 UTC (rev 184925)
+++ trunk/Source/_javascript_Core/ChangeLog	2015-05-27 23:43:22 UTC (rev 184926)
@@ -1,3 +1,27 @@
+2015-05-27  Geoffrey Garen  <[email protected]>
+
+        REGRESSION: These sorting idioms used by Peacekeeper and Browsermark are ~20X slower
+        https://bugs.webkit.org/show_bug.cgi?id=145412
+
+        Reviewed by Benjamin Poulain.
+
+        Cache strings when doing a string-converting sort.
+
+        This is a 21% speedup.
+
+        * builtins/Array.prototype.js:
+        (sort.stringComparator): Use subtraction instead of branching because
+        it's slightly faster.
+
+        (sort.comparatorSort):
+        (sort.stringSort):
+        (sort): Add a special case for string sorting to avoid redundant string
+        conversion.
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::createBindingPattern): Names can be empty if
+        they are private names.
+
 2015-05-26  Filip Pizlo  <[email protected]>
 
         JIT-generated store barrier code should assume the buffer pointer and capacity to be compile-time constants

Modified: trunk/Source/_javascript_Core/builtins/Array.prototype.js (184925 => 184926)


--- trunk/Source/_javascript_Core/builtins/Array.prototype.js	2015-05-27 23:21:58 UTC (rev 184925)
+++ trunk/Source/_javascript_Core/builtins/Array.prototype.js	2015-05-27 23:43:22 UTC (rev 184926)
@@ -286,8 +286,8 @@
 
     function stringComparator(a, b)
     {
-        var aString = @toString(a);
-        var bString = @toString(b);
+        var aString = a.string;
+        var bString = b.string;
 
         var aLength = aString.length;
         var bLength = bString.length;
@@ -300,19 +300,10 @@
             if (aCharCode == bCharCode)
                 continue;
 
-            if (aCharCode < bCharCode)
-                return -1;
-
-            return 1;
+            return aCharCode - bCharCode;
         }
 
-        if (aLength == bLength)
-            return 0;
-
-        if (aLength < bLength)
-            return -1;
-
-        return 1;
+        return aLength - bLength;
     }
 
     // Move undefineds and holes to the end of a sparse array. Result is [values..., undefineds..., holes...].
@@ -440,6 +431,27 @@
         mergeSort(array, valueCount, comparator);
     }
 
+    function stringSort(array)
+    {
+        var length = array.length >>> 0;
+
+        // For compatibility with Firefox and Chrome, do nothing observable
+        // to the target array if it has 0 or 1 sortable properties.
+        if (length < 2)
+            return;
+
+        var valueCount = compact(array, length);
+
+        var strings = new @Array(valueCount);
+        for (var i = 0; i < valueCount; ++i)
+            strings[i] = { string: @toString(array[i]), value: array[i] };
+
+        mergeSort(strings, valueCount, stringComparator);
+
+        for (var i = 0; i < valueCount; ++i)
+            array[i] = strings[i].value;
+    }
+
     if (this === null)
         throw new @TypeError("Array.prototype.sort requires that |this| not be null");
 
@@ -449,11 +461,13 @@
     if (typeof this == "string")
         throw new @TypeError("Attempted to assign to readonly property.");
 
-    if (typeof comparator !== "function")
-        comparator = stringComparator;
+    var array = @Object(this);
 
-    var array = @Object(this);
-    comparatorSort(array, comparator);
+    if (typeof comparator == "function")
+        comparatorSort(array, comparator);
+    else
+        stringSort(array);
+
     return array;
 }
 

Modified: trunk/Source/_javascript_Core/parser/Parser.cpp (184925 => 184926)


--- trunk/Source/_javascript_Core/parser/Parser.cpp	2015-05-27 23:21:58 UTC (rev 184925)
+++ trunk/Source/_javascript_Core/parser/Parser.cpp	2015-05-27 23:43:22 UTC (rev 184926)
@@ -534,7 +534,6 @@
 template <typename LexerType>
 template <class TreeBuilder> TreeDeconstructionPattern Parser<LexerType>::createBindingPattern(TreeBuilder& context, DeconstructionKind kind, const Identifier& name, int depth, JSToken token)
 {
-    ASSERT(!name.isEmpty());
     ASSERT(!name.isNull());
     
     ASSERT(name.impl()->isAtomic() || name.impl()->isSymbol());
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to