Commit fac30cc6 authored by Peter Marshall's avatar Peter Marshall Committed by Commit Bot

[benchmarks] Move Array slice benchmarks to js-perf-test

These were leftover in another directory and can be incorporated into
our standard benchmark runner. We already had some Array slice cases
in js-perf-test so just add some of the important cases from the other
directory to the existing implementation.

Bug: v8:9254
Change-Id: I4cc235b8d3719ecd729f23fe9705ea36d445c340
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1617258
Auto-Submit: Peter Marshall <petermarshall@chromium.org>
Commit-Queue: Yang Guo <yangguo@chromium.org>
Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#61640}
parent 5cc9f9bc
// 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.
const kIterations = 1000000;
const kIterationShort = 10000;
const kArraySize = 64;
let smi_array = [];
for (let i = 0; i < kArraySize; ++i) smi_array[i] = Math.floor(Math.random() * 100);
let start = performance.now();
for (let x = 0; x < kIterations; ++x) {
smi_array.slice(0);
}
let stop = performance.now();
print("smi_array copy: " + (Math.floor((stop - start)*10)/10) + " ms");
start = performance.now();
for (let x = 0; x < kIterations; ++x) {
smi_array.slice(x % kArraySize);
}
stop = performance.now();
print("smi_array: " + (Math.floor((stop - start)*10)/10) + " ms");
let double_array = [];
for (let i = 0; i < kArraySize; ++i) double_array[i] = Math.random() * 100;
start = performance.now();
for (let x = 0; x < kIterations; ++x) {
double_array.slice(x % kArraySize);
}
stop = performance.now();
print("double_array: " + (Math.floor((stop - start)*10)/10) + " ms");
let object_array = [];
for (let i = 0; i < kArraySize; ++i) object_array[i] = new Object();
start = performance.now();
for (let x = 0; x < kIterations; ++x) {
object_array.slice(x % kArraySize);
}
stop = performance.now();
print("object_array: " + (Math.floor((stop - start)*10)/10) + " ms");
let dictionary_array = [];
for (let i = 0; i < kArraySize; ++i) dictionary_array[i] = new Object();
dictionary_array[100000] = new Object();
start = performance.now();
for (let x = 0; x < kIterationShort; ++x) {
dictionary_array.slice(x % kArraySize);
}
stop = performance.now();
print("dictionary: " + (Math.floor((stop - start)*10)/10) + " ms");
let arguments_array;
function sloppy() {
arguments_array = arguments;
}
sloppy.apply(null, smi_array);
start = performance.now();
for (let x = 0; x < kIterations; ++x) {
let r = Array.prototype.slice.call(arguments_array, x % kArraySize);
}
stop = performance.now();
print("arguments_array (sloppy): " + (Math.floor((stop - start)*10)/10) + " ms");
function sloppy2 (a) {
arguments_array = arguments;
}
sloppy2.apply(null, smi_array);
start = performance.now();
for (let x = 0; x < kIterations; ++x) {
Array.prototype.slice.call(arguments_array, x % kArraySize);
}
stop = performance.now();
print("arguments_array (fast aliased): " + (Math.floor((stop - start)*10)/10) + " ms");
delete arguments_array[5];
start = performance.now();
for (let x = 0; x < kIterationShort; ++x) {
Array.prototype.slice.call(arguments_array, x % kArraySize);
}
stop = performance.now();
print("arguments_array (slow aliased): " + (Math.floor((stop - start)*10)/10) + " ms");
// 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.
(() => {
const A = new Array(1000);
const kArraySize = 1000;
(() => {
const A = new Array(kArraySize);
for (let i = 0; i < A.length; i++) {
A[i] = i;
}
assert(%HasSmiElements(A), "A should have SMI elements for this test");
// Commonly used to copy.
function testArraySlice0() {
return A.slice(0);
}
function testArraySlice500() {
return A.slice(500);
}
......@@ -33,6 +42,7 @@
return A.slice(200, -300);
}
createSuiteWithWarmup("Array.slice(0)", 1, testArraySlice0);
createSuiteWithWarmup("Array.slice(500)", 1, testArraySlice500);
createSuiteWithWarmup("Array.slice(500,999)", 1, testArraySlice500_999);
createSuiteWithWarmup("Array.slice(-500)", 1, testArraySliceN500);
......@@ -43,7 +53,7 @@
})();
(() => {
const A = new Array(1000);
const A = new Array(kArraySize);
for (let i = 0; i < A.length; i++) {
A[i] = i;
......@@ -52,6 +62,10 @@
A[100000] = 255;
assert(%HasDictionaryElements(A), "A should be in dictionary mode for this test");
function testArraySlice0() {
return A.slice(0);
}
function testArraySlice500_999() {
return A.slice(500, 999);
}
......@@ -68,9 +82,130 @@
return A.slice(200, -300);
}
createSuiteWithWarmup("Array.slice(0)-dict", 1, testArraySlice0);
createSuiteWithWarmup("Array.slice(500,999)-dict", 1, testArraySlice500_999);
createSuiteWithWarmup("Array.slice(200,700)-dict", 1, testArraySlice200_700);
createSuiteWithWarmup("Array.slice(200,-300)-dict", 1, testArraySlice200_N300);
createSuiteWithWarmup("Array.slice(4,1)-dict", 1, testArraySlice4_1);
})();
(() => {
const A = new Array(kArraySize);
for (let i = 0; i < A.length; i++) {
A[i] = i + 0.5;
}
assert(%HasDoubleElements(A), "A should have double elements for this test");
function testArraySlice0() {
return A.slice(0);
}
function testArraySlice500_999() {
return A.slice(500, 999);
}
function testArraySlice200_700() {
return A.slice(200, 700);
}
function testArraySlice200_N300() {
return A.slice(200, -300);
}
function testArraySlice4_1() {
return A.slice(200, -300);
}
createSuiteWithWarmup("Array.slice(0)-double", 1, testArraySlice0);
createSuiteWithWarmup("Array.slice(500,999)-double", 1, testArraySlice500_999);
createSuiteWithWarmup("Array.slice(200,700)-double", 1, testArraySlice200_700);
createSuiteWithWarmup("Array.slice(200,-300)-double", 1, testArraySlice200_N300);
createSuiteWithWarmup("Array.slice(4,1)-double", 1, testArraySlice4_1);
})();
(() => {
const A = new Array(kArraySize);
for (let i = 0; i < A.length; i++) {
A[i] = new Object();
}
assert(%HasObjectElements(A), "A should have object elements for this test");
function testArraySlice0() {
return A.slice(0);
}
function testArraySlice500_999() {
return A.slice(500, 999);
}
function testArraySlice200_700() {
return A.slice(200, 700);
}
function testArraySlice200_N300() {
return A.slice(200, -300);
}
function testArraySlice4_1() {
return A.slice(200, -300);
}
createSuiteWithWarmup("Array.slice(0)-object", 1, testArraySlice0);
createSuiteWithWarmup("Array.slice(500,999)-object", 1, testArraySlice500_999);
createSuiteWithWarmup("Array.slice(200,700)-object", 1, testArraySlice200_700);
createSuiteWithWarmup("Array.slice(200,-300)-object", 1, testArraySlice200_N300);
createSuiteWithWarmup("Array.slice(4,1)-object", 1, testArraySlice4_1);
})();
(() => {
const A = new Array(kArraySize);
for (let i = 0; i < A.length; i++) {
A[i] = i;
}
assert(%HasSmiElements(A), "A should have SMI elements for this test");
let arguments_array;
function sloppy_aliased(a) {
arguments_array = arguments;
}
sloppy_aliased.apply(null, A);
assert(%HasSloppyArgumentsElements(arguments_array),
"arguments_array should have sloppy arguments elements for this test");
function testArraySlice0() {
return Array.prototype.slice.call(arguments_array, 0);
}
function testArraySlice500_999() {
return Array.prototype.slice.call(arguments_array, 500, 999);
}
function testArraySlice200_700() {
return Array.prototype.slice.call(arguments_array, 200, 700);
}
function testArraySlice200_N300() {
return Array.prototype.slice.call(arguments_array, 200, -300);
}
function testArraySlice4_1() {
return Array.prototype.slice.call(arguments_array, 200, -300);
}
createSuiteWithWarmup("Array.slice(0)-sloppy-args", 1, testArraySlice0);
createSuiteWithWarmup("Array.slice(500,999)-sloppy-args", 1, testArraySlice500_999);
createSuiteWithWarmup("Array.slice(200,700)-sloppy-args", 1, testArraySlice200_700);
createSuiteWithWarmup("Array.slice(200,-300)-sloppy-args", 1, testArraySlice200_N300);
createSuiteWithWarmup("Array.slice(4,1)-sloppy-args", 1, testArraySlice4_1);
})();
......@@ -151,16 +151,33 @@
{"name": "MixedFrom"},
{"name": "MixedCowNoMapFrom"},
{"name": "MixedNonCowNoMapFrom"},
{"name": "Array.slice(0)"},
{"name": "Array.slice(500)"},
{"name": "Array.slice(500,999)"},
{"name": "Array.slice(-500)"},
{"name": "Array.slice(200,700)"},
{"name": "Array.slice(200,-300)"},
{"name": "Array.slice(4,1)"},
{"name": "Array.slice(0)-dict"},
{"name": "Array.slice(500,999)-dict"},
{"name": "Array.slice(200,700)-dict"},
{"name": "Array.slice(200,-300)-dict"},
{"name": "Array.slice(4,1)-dict"},
{"name": "Array.slice(0)-double"},
{"name": "Array.slice(500,999)-double"},
{"name": "Array.slice(200,700)-double"},
{"name": "Array.slice(200,-300)-double"},
{"name": "Array.slice(4,1)-double"},
{"name": "Array.slice(0)-object"},
{"name": "Array.slice(500,999)-object"},
{"name": "Array.slice(200,700)-object"},
{"name": "Array.slice(200,-300)-object"},
{"name": "Array.slice(4,1)-object"},
{"name": "Array.slice(0)-sloppy-args"},
{"name": "Array.slice(500,999)-sloppy-args"},
{"name": "Array.slice(200,700)-sloppy-args"},
{"name": "Array.slice(200,-300)-sloppy-args"},
{"name": "Array.slice(4,1)-sloppy-args"},
{"name": "SmiCopyWithin"},
{"name": "StringCopyWithin"},
{"name": "SparseSmiCopyWithin"},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment