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