[JSPerfTests] New tests for Array.prototype.filter and map.

BUG=

Review-Url: https://codereview.chromium.org/2769973005
Cr-Commit-Position: refs/heads/master@{#44115}
This commit is contained in:
mvstanton 2017-03-24 10:39:34 -07:00 committed by Commit bot
parent 7273f7011a
commit 7e08a77deb
4 changed files with 150 additions and 51 deletions

View File

@ -2,22 +2,18 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
new BenchmarkSuite('Filter', [1000], [
new Benchmark('SmiFilter', false, false, 0,
Filter, SmiFilterSetup, ()=>{}),
new Benchmark('DoubleFilter', false, false, 0,
Filter, DoubleFilterSetup, ()=>{}),
new Benchmark('FastFilter', false, false, 0,
Filter, FastFilterSetup, ()=>{}),
new Benchmark('HoleySmiFilter', false, false, 0,
Filter, HoleySmiFilterSetup, ()=>{}),
new Benchmark('HoleyDoubleFilter', false, false, 0,
Filter, HoleyDoubleFilterSetup, ()=>{}),
new Benchmark('HoleyFastFilter', false, false, 0,
Filter, HoleyFastFilterSetup, ()=>{}),
new Benchmark('ObjectFilter', false, false, 0,
GenericFilter, ObjectFilterSetup, ()=>{}),
]);
function benchy(name, test, testSetup) {
new BenchmarkSuite(name, [1000],
[
new Benchmark(name, false, false, 0, test, testSetup, ()=>{})
]);
}
benchy('NaiveFilterReplacement', NaiveFilter, NaiveFilterSetup);
benchy('DoubleFilter', DoubleFilter, DoubleFilterSetup);
benchy('SmiFilter', SmiFilter, SmiFilterSetup);
benchy('FastFilter', FastFilter, FastFilterSetup);
benchy('ObjectFilter', GenericFilter, ObjectFilterSetup);
var array;
var func;
@ -25,7 +21,15 @@ var this_arg;
var result;
var array_size = 100;
function Filter() {
// Although these functions have the same code, they are separated for
// clean IC feedback.
function DoubleFilter() {
result = array.filter(func, this_arg);
}
function SmiFilter() {
result = array.filter(func, this_arg);
}
function FastFilter() {
result = array.filter(func, this_arg);
}
@ -33,52 +37,52 @@ function GenericFilter() {
result = Array.prototype.filter.call(array, func, this_arg);
}
// From the lodash implementation.
function NaiveFilter() {
let index = -1
let resIndex = 0
const length = array == null ? 0 : array.length
const result = []
while (++index < length) {
const value = array[index]
if (func(value, index, array)) {
result[resIndex++] = value
}
}
return result
}
function NaiveFilterSetup() {
// Prime NaiveFilter with polymorphic cases.
array = [1, 2, 3];
func = ()=>true;
NaiveFilter();
NaiveFilter();
array = [3.4]; NaiveFilter();
array = new Array(10); array[0] = 'hello'; NaiveFilter();
SmiFilterSetup();
delete array[1];
}
function SmiFilterSetup() {
array = new Array();
for (var i = 0; i < array_size; i++) array[i] = i;
func = (value, index, object) => { return value % 2 === 0; };
}
function HoleySmiFilterSetup() {
array = new Array(array_size);
for (var i = 0; i < array_size; i++) {
if (i % 2 === 0) array[i] = i;
}
func = (value, index, object) => { return value % 2 === 0; };
}
function DoubleFilterSetup() {
array = new Array();
for (var i = 0; i < array_size; i++) array[i] = (i + 0.5);
func = (value, index, object) => { return Math.floor(value) % 2 === 0; };
}
function HoleyDoubleFilterSetup() {
array = new Array(array_size);
for (var i = 0; i < array_size; i++) {
if (i != 3) {
array[i] = (i + 0.5);
}
}
func = (value, index, object) => { return Math.floor(value) % 2 === 0; };
}
function FastFilterSetup() {
array = new Array();
for (var i = 0; i < array_size; i++) array[i] = 'value ' + i;
func = (value, index, object) => { return index % 2 === 0; };
}
function HoleyFastFilterSetup() {
array = new Array(array_size);
for (var i = 0; i < array_size; i++) {
if (i % 2 != 0) {
array[i] = 'value ' + i;
}
}
func = (value, index, object) => { return index % 2 === 0; };
}
function ObjectFilterSetup() {
array = { length: array_size };
for (var i = 0; i < array_size; i++) {

View File

@ -0,0 +1,88 @@
// 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 benchy(name, test, testSetup) {
new BenchmarkSuite(name, [1000],
[
new Benchmark(name, false, false, 0, test, testSetup, ()=>{})
]);
}
benchy('NaiveMapReplacement', NaiveMap, NaiveMapSetup);
benchy('DoubleMap', DoubleMap, DoubleMapSetup);
benchy('SmiMap', SmiMap, SmiMapSetup);
benchy('FastMap', FastMap, FastMapSetup);
benchy('ObjectMap', GenericMap, ObjectMapSetup);
var array;
var func;
var this_arg;
var result;
var array_size = 100;
// Although these functions have the same code, they are separated for
// clean IC feedback.
function DoubleMap() {
result = array.map(func, this_arg);
}
function SmiMap() {
result = array.map(func, this_arg);
}
function FastMap() {
result = array.map(func, this_arg);
}
function NaiveMap() {
let index = -1
const length = array == null ? 0 : array.length
const result = new Array(length)
while (++index < length) {
result[index] = func(array[index], index, array)
}
return result
}
function GenericMap() {
result = Array.prototype.map.call(array, func, this_arg);
}
function NaiveMapSetup() {
// Prime NaiveMap with polymorphic cases.
array = [1, 2, 3];
func = (v, i, a) => v;
NaiveMap();
NaiveMap();
array = [3.4]; NaiveMap();
array = new Array(10); array[0] = 'hello'; NaiveMap();
SmiMapSetup();
delete array[1];
}
function SmiMapSetup() {
array = new Array();
for (var i = 0; i < array_size; i++) array[i] = i;
func = (value, index, object) => { return value; };
}
function DoubleMapSetup() {
array = new Array();
for (var i = 0; i < array_size; i++) array[i] = (i + 0.5);
func = (value, index, object) => { return value; };
}
function FastMapSetup() {
array = new Array();
for (var i = 0; i < array_size; i++) array[i] = 'value ' + i;
func = (value, index, object) => { return value; };
}
function ObjectMapSetup() {
array = { length: array_size };
for (var i = 0; i < array_size; i++) {
array[i] = i;
}
func = (value, index, object) => { return value; };
}

View File

@ -6,6 +6,7 @@
load('../base.js');
load('filter.js');
load('map.js');
var success = true;
@ -13,10 +14,7 @@ function PrintResult(name, result) {
print(name + '-Array(Score): ' + result);
}
function PrintStep(name) {
print('Completed ' + name + '-Array...');
}
function PrintStep(name) {}
function PrintError(name, error) {
PrintResult(name, error);

View File

@ -345,11 +345,20 @@
"path": ["Array"],
"main": "run.js",
"resources": [
"filter.js"
"filter.js", "map.js"
],
"results_regexp": "^%s\\-Array\\(Score\\): (.+)$",
"tests": [
{"name": "Filter"}
{"name": "NaiveFilterReplacement"},
{"name": "DoubleFilter"},
{"name": "SmiFilter"},
{"name": "FastFilter"},
{"name": "ObjectFilter"},
{"name": "NaiveMapReplacement"},
{"name": "DoubleMap"},
{"name": "SmiMap"},
{"name": "FastMap"},
{"name": "ObjectMap"}
]
}
]