OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 function ObjectWithKeys(count, keyOffset = 0, keyGen) { | 5 function ObjectWithKeys(count, keyOffset = 0, keyGen) { |
6 var o = {}; | 6 var body = ""; |
7 for (var i = 0; i < count; i++) { | 7 for (var i = 0; i < count; i++) { |
8 var key = keyGen(i + keyOffset); | 8 var key = keyGen(i + keyOffset); |
9 o[key] = "value"; | 9 if (typeof key === "string") { |
| 10 body += `this.${key} = 0\n`; |
| 11 } else { |
| 12 body += `this[${key}] = 0\n`; |
| 13 } |
10 } | 14 } |
11 return o; | 15 var f = new Function(body); |
| 16 return new f(); |
12 } | 17 } |
13 | 18 |
14 function ObjectWithProperties(count, keyOffset) { | 19 function ObjectWithProperties(count, keyOffset) { |
15 return ObjectWithKeys(count, keyOffset, (key) => "key" + key ); | 20 return ObjectWithKeys(count, keyOffset, (key) => "key" + key ); |
16 } | 21 } |
17 | 22 |
18 function ObjectWithElements(count, keyOffset) { | 23 function ObjectWithElements(count, keyOffset) { |
19 return ObjectWithKeys(count, keyOffset, (key) => key ); | 24 return ObjectWithKeys(count, keyOffset, (key) => key ); |
20 } | 25 } |
21 | 26 |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 } | 164 } |
160 | 165 |
161 | 166 |
162 var TestData = []; | 167 var TestData = []; |
163 | 168 |
164 [true, false].forEach((cachable) => { | 169 [true, false].forEach((cachable) => { |
165 [OBJ_MODE_FAST, OBJ_MODE_SLOW].forEach((obj_mode) => { | 170 [OBJ_MODE_FAST, OBJ_MODE_SLOW].forEach((obj_mode) => { |
166 var proto_mode = cachable ? "" : "-with-slow-proto"; | 171 var proto_mode = cachable ? "" : "-with-slow-proto"; |
167 var name = `${obj_mode}-obj${proto_mode}`; | 172 var name = `${obj_mode}-obj${proto_mode}`; |
168 var objects = []; | 173 var objects = []; |
169 [10, 50, 100, 200, 500, 1000].forEach((prop_count) => { | 174 [10, 50, 100, 200, 500].forEach((prop_count) => { |
170 // Create object with prop_count properties and prop_count elements. | 175 // Create object with prop_count properties and prop_count elements. |
171 obj = ObjectWithProtoKeys(5, prop_count * 2, cachable, | 176 obj = ObjectWithProtoKeys(5, prop_count * 2, cachable, |
172 ObjectWithMixedKeys); | 177 ObjectWithMixedKeys); |
173 if (obj_mode == OBJ_MODE_SLOW) { | 178 if (obj_mode == OBJ_MODE_SLOW) { |
174 obj = MakeDictionaryMode(obj); | 179 obj = MakeDictionaryMode(obj); |
175 } | 180 } |
176 objects.push(obj); | 181 objects.push(obj); |
177 }); | 182 }); |
178 TestData.push({name, objects}); | 183 TestData.push({name, objects}); |
179 }); | 184 }); |
180 }); | 185 }); |
181 | 186 |
182 | 187 |
183 // ============================================================================ | 188 // ============================================================================ |
184 | 189 |
185 function CreateTestFunction(template, object, keys) { | 190 function CreateTestFunction(template, object, keys) { |
186 // Force a new function for each test-object to avoid side-effects due to ICs. | 191 // Force a new function for each test-object to avoid side-effects due to ICs. |
187 var text = "// random comment " + Math.random() + "\n" + | 192 var text = "// random comment " + Math.random() + "\n" + |
188 template(object, keys); | 193 template(object, keys); |
189 var func = new Function("object", "keys", text); | 194 var func = new Function("object", "keys", text); |
190 return () => func(object, keys); | 195 return () => func(object, keys); |
191 } | 196 } |
192 | 197 |
| 198 function CombineTestFunctions(tests) { |
| 199 return () => { |
| 200 for (var i = 0; i < tests.length; i++ ) { |
| 201 tests[i](); |
| 202 } |
| 203 }; |
| 204 } |
| 205 |
193 var TestFunctions = [ | 206 var TestFunctions = [ |
194 { | 207 { |
195 name: "in", | 208 name: "in", |
196 // Query all keys. | 209 // Query all keys. |
197 keys: (object) => Object.keys(object), | 210 keys: (object) => Object.keys(object), |
198 template: (object, keys) => { | 211 template: (object, keys) => { |
199 var lines = [ | 212 var lines = [ |
200 `var result = true;`, | 213 `var result = true;`, |
201 `for (var i = 0; i < keys.length; i++) {`, | 214 `for (var i = 0; i < keys.length; i++) {`, |
202 ` var key = keys[i];`, | 215 ` var key = keys[i];`, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 | 247 |
235 for (var test_function_desc of TestFunctions) { | 248 for (var test_function_desc of TestFunctions) { |
236 var test_function_name = test_function_desc.name; | 249 var test_function_name = test_function_desc.name; |
237 | 250 |
238 for (var query_kind of TestQueries) { | 251 for (var query_kind of TestQueries) { |
239 var benchmarks = []; | 252 var benchmarks = []; |
240 var suit_name = test_function_name + "--" + query_kind; | 253 var suit_name = test_function_name + "--" + query_kind; |
241 for (var test_data of TestData) { | 254 for (var test_data of TestData) { |
242 var name = suit_name + "--" + test_data.name; | 255 var name = suit_name + "--" + test_data.name; |
243 | 256 |
| 257 var tests = []; |
244 for (var object of test_data.objects) { | 258 for (var object of test_data.objects) { |
245 var keys = test_function_desc.keys(object); | 259 var keys = test_function_desc.keys(object); |
246 keys = MakeKeyQueries(keys, query_kind); | 260 keys = MakeKeyQueries(keys, query_kind); |
247 | 261 |
248 var test_function = CreateTestFunction(test_function_desc.template, | 262 var test = CreateTestFunction(test_function_desc.template, object, |
249 object, keys); | 263 keys); |
250 | 264 tests.push(test); |
251 var benchmark = new Benchmark(name, false, true, 400, test_function); | |
252 benchmarks.push(benchmark); | |
253 } | 265 } |
| 266 var run_function = CombineTestFunctions(tests); |
| 267 var benchmark = new Benchmark(name, false, false, 0, run_function); |
| 268 benchmarks.push(benchmark); |
254 } | 269 } |
255 Benchmarks.push(new BenchmarkSuite(suit_name, [100], benchmarks)); | 270 Benchmarks.push(new BenchmarkSuite(suit_name, [100], benchmarks)); |
256 } | 271 } |
257 } | 272 } |
258 | 273 |
259 // ============================================================================ | 274 // ============================================================================ |
OLD | NEW |