• Benedikt Meurer's avatar
    [builtins] Speed-up Object.prototype.toString. · 31800120
    Benedikt Meurer authored
    The @@toStringTag lookup in Object.prototype.toString causes quite a
    lot of overhead and oftentimes dominates the builtin performance. These
    lookups are almost always negative, especially for primitive values,
    and Object.prototype.toString is often used to implement predicates
    (like in Node core or in AngularJS), so having a way to skip the
    negative lookup yields big performance gains.
    
    This CL introduces a "MayHaveInterestingSymbols" bit on every map,
    which says whether instances with this map may have an interesting
    symbol. Currently only @@toStringTag is considered an interesting
    symbol, but we can extend that in the future.
    
    In the Object.prototype.toString we can use the interesting symbols
    bit to do a quick check on the prototype chain to see if there are
    any maps that might have the @@toStringTag, and if not, we can just
    immediately return the result, which is very fast because it's derived
    from the instance type. This also avoids the ToObject conversions for
    primitive values, which is important, since this causes unnecessary
    GC traffic and in for example AngularJS, strings are also often probed
    via the Object.prototype.toString based predicates.
    
    This boosts Speedometer/AngularJS by over 3% and Speedometer overall
    by up to 1%. On the microbenchmark from the similar SpiderMonkey bug
    (https://bugzilla.mozilla.org/show_bug.cgi?id=1369042), we go from
    roughly 450ms to 70ms, which corresponds to a 6.5x improvement.
    
    ```
    function f() {
        var res = "";
        var a = [1, 2, 3];
        var toString = Object.prototype.toString;
        var t = new Date;
        for (var i = 0; i < 5000000; i++)
    	res = toString.call(a);
        print(new Date - t);
        return res;
    }
    f();
    ```
    
    The design document at https://goo.gl/e8CruQ has some additional
    data points.
    
    TBR=ulan@chromium.org
    
    Bug: v8:6654
    Change-Id: I31932cf41ecddad079d294e2c322a852af0ed244
    Reviewed-on: https://chromium-review.googlesource.com/593620
    Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
    Reviewed-by: 's avatarCamillo Bruni <cbruni@chromium.org>
    Reviewed-by: 's avatarJaroslav Sevcik <jarin@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#47034}
    31800120
map.h 38.2 KB