Index: test/js-perf-test/Array/map.js |
diff --git a/test/js-perf-test/Array/map.js b/test/js-perf-test/Array/map.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..db6d8f0fe54986cf86134a1c20cfa48ba29f1b1f |
--- /dev/null |
+++ b/test/js-perf-test/Array/map.js |
@@ -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; }; |
+} |