• Benedikt Meurer's avatar
    [es2015] Optimize TypedArray.prototype[Symbol.toStringTag]. · b8b76eba
    Benedikt Meurer authored
    The TypedArray.prototype[Symbol.toStringTag] getter is currently the best (and
    as far as I can tell only definitely side-effect free) way to check whether an
    arbitrary object is a TypedArray - either generally TypedArray or a specific
    one like Uint8Array. Using the getter is thus emerging as the general pattern
    to detect TypedArrays, even Node.js now adapted it starting with
    
      https://github.com/nodejs/node/pull/15663
    
    for the isTypedArray and isUint8Array type checks in lib/internal/util/types.js
    now.
    
    The getter returns either the string with the TypedArray subclass name
    (i.e. "Uint8Array") or undefined if the receiver is not a TypedArray.
    This can be implemented with a simple elements kind dispatch, instead of
    checking the instance type and then loading the class name from the
    constructor, which requires a loop walking up the transition tree. This
    CL ports the builtin to CSA and TurboFan, and changes the logic to a
    simple elements kind check. On the micro-benchmark mentioned in the
    referenced bug, the time goes from
    
      testIsArrayBufferView: 565 ms.
      testIsTypedArray: 2403 ms.
      testIsUint8Array: 3847 ms.
    
    to
    
      testIsArrayBufferView: 566 ms.
      testIsTypedArray: 965 ms.
      testIsUint8Array: 965 ms.
    
    which presents an up to 4x improvement.
    
    Bug: v8:6874
    Change-Id: I9c330b4529d9631df2f052acf023c6a4fae69611
    Reviewed-on: https://chromium-review.googlesource.com/695021Reviewed-by: 's avatarJaroslav Sevcik <jarin@chromium.org>
    Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#48254}
    b8b76eba
Name
Last commit
Last update
..
OWNERS Loading commit data...
array.js Loading commit data...
intl.js Loading commit data...
macros.py Loading commit data...
messages.js Loading commit data...
prologue.js Loading commit data...
proxy.js Loading commit data...
spread.js Loading commit data...
string.js Loading commit data...
typedarray.js Loading commit data...
v8natives.js Loading commit data...
weak-collection.js Loading commit data...