f31bae0330
It's quite common today to use Function#apply together with typed arrays, for example to construct a String from character codes (or code points) within a Uint8Array or Uint16Array, i.e. String.fromCharCode.apply(undefined, uint8array) is seen quite often on the web. But there are other interesting cases like Math.max.apply(undefined, float64array) to compute the maximum value in a Float64Array, which is definitely not the fastest implementation, but quite convenient and readable. Unfortunately these cases hit the super-slow-path of the Function#apply machinery in V8 currently, because Function#apply doesn't have any fast-path for TypedArrays. This CL adds a proper fast-path to CreateListFromArrayLike to the ElementsAccessor, which can be used as long as the typed array that's passed wasn't neutered. With this fast-path in place, the performance on the micro-benchmark mentioned in the issue improves from stringFromCharCode: 6386 ms. stringFromCodePoint: 8752 ms. to stringFromCharCode: 1932 ms. stringFromCodePoint: 4262 ms. which corresponds to a 2.0x-3.3x improvement. Bug: v8:2435 Change-Id: I4d39666e53644b11d5856982b005928e26f296fe Reviewed-on: https://chromium-review.googlesource.com/657405 Reviewed-by: Yang Guo <yangguo@chromium.org> Commit-Queue: Benedikt Meurer <bmeurer@chromium.org> Cr-Commit-Position: refs/heads/master@{#47936}
26 lines
621 B
JavaScript
26 lines
621 B
JavaScript
// Copyright 2017 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
function arrayLikeToString(a) {
|
|
return String.fromCharCode.apply(this, a);
|
|
}
|
|
|
|
const klasses = [
|
|
Int8Array,
|
|
Uint8Array,
|
|
Uint8ClampedArray,
|
|
Int16Array,
|
|
Uint16Array,
|
|
Int32Array,
|
|
Uint32Array,
|
|
Float32Array,
|
|
Float64Array
|
|
];
|
|
const string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
|
|
|
for (const klass of klasses) {
|
|
const array = klass.from(string, s => s.charCodeAt(0));
|
|
assertEquals(string, arrayLikeToString(array));
|
|
}
|