fe9de0b6f3
This makes clear that some benchmarks where Array.from is used to clone the array are very fast because the array is COW, and the added benchmarks for non-COW arrays are not as fast. COW-ness does not affect benchmarks where Array.from is called with a callback function. Change-Id: Ie9dd5507df5dd7501ac955dba4d3682c4a54548e Reviewed-on: https://chromium-review.googlesource.com/c/1314333 Reviewed-by: Georg Neis <neis@chromium.org> Commit-Queue: Hai Dang <dhai@google.com> Cr-Commit-Position: refs/heads/master@{#57208}
226 lines
6.6 KiB
JavaScript
226 lines
6.6 KiB
JavaScript
// Copyright 2018 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.
|
|
(() => {
|
|
|
|
createSuite('MixedFrom', 1000, MixedFrom, MixedFromSetup);
|
|
createSuite(
|
|
'MixedCowNoMapFrom', 1000, MixedCowNoMapFrom, MixedCowNoMapFromSetup);
|
|
createSuite('MixedNonCowNoMapFrom', 1000, MixedNonCowNoMapFrom,
|
|
MixedNonCowNoMapFromSetup);
|
|
createSuite('SmiFrom', 1000, SmiFrom, SmiFromSetup);
|
|
createSuite('SmallSmiFrom', 1000, SmallSmiFrom, SmallSmiFromSetup);
|
|
createSuite('SmiCowNoMapFrom', 1000, SmiCowNoMapFrom, SmiCowNoMapFromSetup);
|
|
createSuite(
|
|
'SmiNonCowNoMapFrom', 1000, SmiNonCowNoMapFrom, SmiNonCowNoMapFromSetup);
|
|
createSuite(
|
|
'SmiNoIteratorFrom', 1000, SmiNoIteratorFrom, SmiNoIteratorFromSetup);
|
|
createSuite(
|
|
'TransplantedFrom', 1000, TransplantedFrom, TransplantedFromSetup);
|
|
createSuite('DoubleFrom', 1000, DoubleFrom, DoubleFromSetup);
|
|
createSuite('DoubleNoMapFrom', 1000, DoubleNoMapFrom, DoubleNoMapFromSetup);
|
|
createSuite('StringFrom', 1000, StringFrom, StringFromSetup);
|
|
createSuite(
|
|
'StringCowNoMapFrom', 1000, StringCowNoMapFrom, StringCowNoMapFromSetup);
|
|
createSuite('StringNonCowNoMapFrom', 1000, StringNonCowNoMapFrom,
|
|
StringNonCowNoMapFromSetup);
|
|
|
|
function ArrayLike() {}
|
|
ArrayLike.from = Array.from;
|
|
|
|
var arg
|
|
var result;
|
|
var func
|
|
|
|
// This creates a COW array of smis. COWness does not affect the performance
|
|
// of Array.from calls with a callback function.
|
|
var smi_array_Cow = [
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
|
];
|
|
|
|
// This creates a non-COW array.
|
|
var smi_array = Array.from(smi_array_Cow);
|
|
smi_array[0] = 1;
|
|
|
|
// This creates an array of doubles. There is no COW array for doubles.
|
|
var double_array = [
|
|
1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, //
|
|
11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5,
|
|
1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, //
|
|
11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5,
|
|
1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, //
|
|
11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5,
|
|
1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, //
|
|
11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5,
|
|
1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, //
|
|
11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5,
|
|
];
|
|
|
|
// This creates a COW array of objects.
|
|
var string_array_Cow = [
|
|
'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b',
|
|
'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a',
|
|
'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b',
|
|
'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a',
|
|
'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b',
|
|
'c', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a',
|
|
'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a',
|
|
];
|
|
|
|
// This creates a non-COW array.
|
|
var string_array = Array.from(string_array_Cow);
|
|
string_array[0] = 'a';
|
|
|
|
// This creates a COW array of objects.
|
|
var mixed_array_Cow = [
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
|
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, //
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
|
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, //
|
|
1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5,
|
|
11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, //
|
|
1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5,
|
|
11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, //
|
|
'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a',
|
|
'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a',
|
|
];
|
|
|
|
// This creates a non-COW array.
|
|
var mixed_array = Array.from(mixed_array_Cow);
|
|
mixed_array[0] = 1;
|
|
|
|
// Although these functions have the same code, they are separated for
|
|
// clean IC feedback.
|
|
function SmallSmiFrom() {
|
|
result = Array.from(arg, func);
|
|
}
|
|
|
|
function SmiCowNoMapFrom() {
|
|
result = Array.from(arg);
|
|
}
|
|
|
|
function SmiNonCowNoMapFrom() {
|
|
result = Array.from(arg);
|
|
}
|
|
|
|
function SmiFrom() {
|
|
result = Array.from(arg, func);
|
|
}
|
|
|
|
function SmiNoIteratorFrom() {
|
|
result = Array.from(arg, func);
|
|
}
|
|
|
|
function TransplantedFrom() {
|
|
result = ArrayLike.from(arg, func);
|
|
}
|
|
|
|
function DoubleFrom() {
|
|
result = Array.from(arg, func);
|
|
}
|
|
|
|
function DoubleNoMapFrom() {
|
|
result = Array.from(arg);
|
|
}
|
|
|
|
function StringFrom() {
|
|
result = Array.from(arg, func);
|
|
}
|
|
|
|
function StringCowNoMapFrom() {
|
|
result = Array.from(arg);
|
|
}
|
|
|
|
function StringNonCowNoMapFrom() {
|
|
result = Array.from(arg);
|
|
}
|
|
|
|
function MixedFrom() {
|
|
result = Array.from(arg, func);
|
|
}
|
|
|
|
function MixedCowNoMapFrom() {
|
|
result = Array.from(arg);
|
|
}
|
|
|
|
function MixedNonCowNoMapFrom() {
|
|
result = Array.from(arg);
|
|
}
|
|
|
|
function SmallSmiFromSetup() {
|
|
func = (v, i) => v + i;
|
|
arg = [1, 2, 3];
|
|
}
|
|
|
|
function SmiCowNoMapFromSetup() {
|
|
func = undefined;
|
|
arg = smi_array_Cow;
|
|
}
|
|
|
|
function SmiNonCowNoMapFromSetup() {
|
|
func = undefined;
|
|
arg = smi_array;
|
|
}
|
|
|
|
function SmiFromSetup() {
|
|
func = (v, i) => v + i;
|
|
arg = smi_array_Cow;
|
|
}
|
|
|
|
function SmiNoIteratorFromSetup() {
|
|
func = (v, i) => v + i;
|
|
array = smi_array_Cow;
|
|
arg = {length: array.length};
|
|
Object.assign(arg, array);
|
|
}
|
|
|
|
function TransplantedFromSetup() {
|
|
func = (v, i) => v + i;
|
|
arg = smi_array_Cow;
|
|
}
|
|
|
|
function DoubleFromSetup() {
|
|
func = (v, i) => v + i;
|
|
arg = double_array;
|
|
}
|
|
|
|
function DoubleNoMapFromSetup() {
|
|
func = undefined;
|
|
arg = double_array;
|
|
}
|
|
|
|
function StringFromSetup() {
|
|
func = (v, i) => v + i;
|
|
arg = string_array_Cow;
|
|
}
|
|
|
|
function StringCowNoMapFromSetup() {
|
|
func = undefined;
|
|
arg = string_array_Cow;
|
|
}
|
|
|
|
function StringNonCowNoMapFromSetup() {
|
|
func = undefined;
|
|
arg = string_array;
|
|
}
|
|
|
|
function MixedFromSetup() {
|
|
func = (v, i) => v + i;
|
|
arg = mixed_array_Cow;
|
|
}
|
|
|
|
function MixedCowNoMapFromSetup() {
|
|
func = undefined;
|
|
arg = mixed_array_Cow;
|
|
}
|
|
|
|
function MixedNonCowNoMapFromSetup() {
|
|
func = undefined;
|
|
arg = mixed_array;
|
|
}
|
|
})();
|