[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:
parent
7273f7011a
commit
7e08a77deb
@ -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++) {
|
||||
|
88
test/js-perf-test/Array/map.js
Normal file
88
test/js-perf-test/Array/map.js
Normal 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; };
|
||||
}
|
@ -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);
|
||||
|
@ -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"}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
Loading…
Reference in New Issue
Block a user