| Index: test/js-perf-test/Array/filter.js
|
| diff --git a/test/js-perf-test/Array/filter.js b/test/js-perf-test/Array/filter.js
|
| index 58995849fd423ae9d4077a45cbc04ab23d83913d..de510a4097fbb4748050b24836e548774b4af685 100644
|
| --- a/test/js-perf-test/Array/filter.js
|
| +++ b/test/js-perf-test/Array/filter.js
|
| @@ -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++) {
|
|
|