Ignore:
Timestamp:
May 27, 2015, 4:43:22 PM (10 years ago)
Author:
[email protected]
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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/builtins/Array.prototype.js

    r184917 r184926  
    287287    function stringComparator(a, b)
    288288    {
    289         var aString = @toString(a);
    290         var bString = @toString(b);
     289        var aString = a.string;
     290        var bString = b.string;
    291291
    292292        var aLength = aString.length;
     
    301301                continue;
    302302
    303             if (aCharCode < bCharCode)
    304                 return -1;
    305 
    306             return 1;
    307         }
    308 
    309         if (aLength == bLength)
    310             return 0;
    311 
    312         if (aLength < bLength)
    313             return -1;
    314 
    315         return 1;
     303            return aCharCode - bCharCode;
     304        }
     305
     306        return aLength - bLength;
    316307    }
    317308
     
    441432    }
    442433
     434    function stringSort(array)
     435    {
     436        var length = array.length >>> 0;
     437
     438        // For compatibility with Firefox and Chrome, do nothing observable
     439        // to the target array if it has 0 or 1 sortable properties.
     440        if (length < 2)
     441            return;
     442
     443        var valueCount = compact(array, length);
     444
     445        var strings = new @Array(valueCount);
     446        for (var i = 0; i < valueCount; ++i)
     447            strings[i] = { string: @toString(array[i]), value: array[i] };
     448
     449        mergeSort(strings, valueCount, stringComparator);
     450
     451        for (var i = 0; i < valueCount; ++i)
     452            array[i] = strings[i].value;
     453    }
     454
    443455    if (this === null)
    444456        throw new @TypeError("Array.prototype.sort requires that |this| not be null");
     
    450462        throw new @TypeError("Attempted to assign to readonly property.");
    451463
    452     if (typeof comparator !== "function")
    453         comparator = stringComparator;
    454 
    455     var array = @Object(this);
    456     comparatorSort(array, comparator);
     464    var array = @Object(this);
     465
     466    if (typeof comparator == "function")
     467        comparatorSort(array, comparator);
     468    else
     469        stringSort(array);
     470
    457471    return array;
    458472}
Note: See TracChangeset for help on using the changeset viewer.