| // 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 newBenchmark(name, handlers) { |
| new BenchmarkSuite(name, [1000], [ |
| new Benchmark(name, false, false, 0, |
| handlers.run, handlers.setup, handlers.teardown) |
| ]); |
| } |
| |
| // ---------------------------------------------------------------------------- |
| |
| var result; |
| var foo = () => {} |
| |
| newBenchmark("ProxyConstructorWithArrowFunc", { |
| setup() { }, |
| run() { |
| var proxy = new Proxy(foo, {}); |
| result = proxy; |
| }, |
| teardown() { |
| return (typeof result == 'function'); |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| class Class {}; |
| |
| newBenchmark("ProxyConstructorWithClass", { |
| setup() { }, |
| run() { |
| var proxy = new Proxy(Class, {}); |
| result = proxy; |
| }, |
| teardown() { |
| return (typeof result == 'function'); |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| let obj = {}; |
| |
| newBenchmark("ProxyConstructorWithObject", { |
| setup() { }, |
| run() { |
| var proxy = new Proxy(obj, {}); |
| result = proxy; |
| }, |
| teardown() { |
| return (typeof result == 'function'); |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| var p = new Proxy({}, {}); |
| |
| newBenchmark("ProxyConstructorWithProxy", { |
| setup() { }, |
| run() { |
| var proxy = new Proxy(p, {}); |
| result = proxy; |
| }, |
| teardown() { |
| return (typeof result == 'function'); |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| const SOME_NUMBER = 42; |
| const SOME_OTHER_NUMBER = 1337; |
| const ITERATIONS = 1000; |
| |
| newBenchmark("CallProxyWithoutTrap", { |
| setup() { |
| const target = () => { return SOME_NUMBER; }; |
| p = new Proxy(target, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| p(); |
| } |
| }, |
| teardown() { |
| return (result === SOME_NUMBER); |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("CallProxyWithTrap", { |
| setup() { |
| const target = () => { return SOME_NUMBER; }; |
| p = new Proxy(target, { |
| apply: function(target, thisArg, argumentsList) { |
| return SOME_OTHER_NUMBER; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| p(); |
| } |
| }, |
| teardown() { |
| return (result === SOME_OTHER_NUMBER); |
| } |
| }); |
| |
| var instance; |
| class MyClass { |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("ConstructProxyWithoutTrap", { |
| setup() { |
| p = new Proxy(MyClass, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| instance = new p(); |
| } |
| }, |
| teardown() { |
| return instance instanceof MyClass; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("ConstructProxyWithTrap", { |
| setup() { |
| p = new Proxy(Object, { |
| construct: function(target, argumentsList, newTarget) { |
| return new MyClass; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| instance = new p(); |
| } |
| }, |
| teardown() { |
| return instance instanceof MyClass; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| obj = { |
| prop: SOME_NUMBER |
| } |
| let value; |
| |
| newBenchmark("GetStringWithoutTrap", { |
| setup() { |
| p = new Proxy(obj, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = p.prop; |
| } |
| }, |
| teardown() { |
| return value === SOME_NUMBER; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("GetStringWithTrap", { |
| setup() { |
| p = new Proxy(obj, { |
| get: function(target, propertyKey, receiver) { |
| return SOME_OTHER_NUMBER; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = p.prop; |
| } |
| }, |
| teardown() { |
| return value === SOME_OTHER_NUMBER; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| obj = [SOME_NUMBER]; |
| |
| newBenchmark("GetIndexWithoutTrap", { |
| setup() { |
| p = new Proxy(obj, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = p[0]; |
| } |
| }, |
| teardown() { |
| return value === SOME_NUMBER; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("GetIndexWithTrap", { |
| setup() { |
| p = new Proxy(obj, { |
| get: function(target, propertyKey, receiver) { |
| return SOME_OTHER_NUMBER; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = p[0]; |
| } |
| }, |
| teardown() { |
| return value === SOME_OTHER_NUMBER; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| var symbol = Symbol(); |
| obj[symbol] = SOME_NUMBER; |
| |
| newBenchmark("GetSymbolWithoutTrap", { |
| setup() { |
| p = new Proxy(obj, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = p[symbol]; |
| } |
| }, |
| teardown() { |
| return value === SOME_NUMBER; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("GetSymbolWithTrap", { |
| setup() { |
| p = new Proxy(obj, { |
| get: function(target, propertyKey, receiver) { |
| return SOME_OTHER_NUMBER; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = p[symbol]; |
| } |
| }, |
| teardown() { |
| return value === SOME_OTHER_NUMBER; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| obj = {}; |
| |
| newBenchmark("HasStringWithoutTrap", { |
| setup() { |
| p = new Proxy(obj, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = ('prop' in p); |
| } |
| }, |
| teardown() { |
| return value === true; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("HasStringWithTrap", { |
| setup() { |
| p = new Proxy(obj, { |
| has: function(target, propertyKey) { |
| return true; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = ('prop' in p); |
| } |
| }, |
| teardown() { |
| return value === true; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| obj[symbol] = SOME_NUMBER; |
| |
| newBenchmark("HasSymbolWithoutTrap", { |
| setup() { |
| p = new Proxy(obj, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = (symbol in p); |
| } |
| }, |
| teardown() { |
| return value === true; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("HasSymbolWithTrap", { |
| setup() { |
| p = new Proxy(obj, { |
| has: function(target, propertyKey) { |
| return true; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = (symbol in p); |
| } |
| }, |
| teardown() { |
| return value === true; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| obj = { |
| prop: undefined |
| } |
| value = SOME_NUMBER; |
| |
| newBenchmark("SetStringWithoutTrap", { |
| setup() { |
| p = new Proxy(obj, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| p.prop = value; |
| } |
| }, |
| teardown() { |
| return value === SOME_NUMBER; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("SetStringWithTrap", { |
| setup() { |
| p = new Proxy(obj, { |
| set: function(target, propertyKey, value, receiver) { |
| target[propertyKey] = SOME_OTHER_NUMBER; |
| return true; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| p.prop = value; |
| } |
| }, |
| teardown() { |
| return value === SOME_OTHER_NUMBER; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| obj = [undefined]; |
| value = SOME_NUMBER; |
| |
| newBenchmark("SetIndexWithoutTrap", { |
| setup() { |
| p = new Proxy(obj, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| p[0] = value; |
| } |
| }, |
| teardown() { |
| return value === SOME_NUMBER; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("SetIndexWithTrap", { |
| setup() { |
| p = new Proxy(obj, { |
| set: function(target, propertyKey, value, receiver) { |
| target[propertyKey] = SOME_OTHER_NUMBER; |
| return true; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| p[0] = value; |
| } |
| }, |
| teardown() { |
| return value === SOME_OTHER_NUMBER; |
| } |
| }); |
| // ---------------------------------------------------------------------------- |
| |
| obj[symbol] = undefined; |
| value = SOME_NUMBER; |
| |
| newBenchmark("SetSymbolWithoutTrap", { |
| setup() { |
| p = new Proxy(obj, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| p[symbol] = value; |
| } |
| }, |
| teardown() { |
| return value === SOME_NUMBER; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("SetSymbolWithTrap", { |
| setup() { |
| p = new Proxy(obj, { |
| set: function(target, propertyKey, value, receiver) { |
| target[propertyKey] = SOME_OTHER_NUMBER; |
| return true; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| p[symbol] = value; |
| } |
| }, |
| teardown() { |
| return value === SOME_OTHER_NUMBER; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| var obj20prop = {}; |
| var measured; |
| |
| newBenchmark("HasInIdiom", { |
| setup() { |
| for (var i = 0; i < 20; ++i) { |
| obj20prop['prop' + i] = SOME_NUMBER; |
| } |
| p = new Proxy(obj20prop, { |
| has: function(target, propertyKey) { |
| return true; |
| }, |
| get: function(target, propertyKey, receiver) { |
| if (typeof propertyKey == 'string' && propertyKey.match('prop')) |
| return SOME_NUMBER; |
| else |
| return Reflect.get(target, propertyKey, receiver); |
| }, |
| }); |
| measured = function measured(o) { |
| var result = 0; |
| for (var x in o) { |
| if (Object.prototype.hasOwnProperty(o, x)) { |
| var v = o[x]; |
| result += v; |
| } |
| } |
| return result; |
| } |
| }, |
| run() { |
| result = measured(p); |
| }, |
| teardown() { |
| return result === 20 * SOME_NUMBER; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| obj = {}; |
| value = false; |
| |
| newBenchmark("IsExtensibleWithoutTrap", { |
| setup() { |
| p = new Proxy(obj, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = Object.isExtensible(p); |
| } |
| return value; |
| }, |
| teardown() { |
| return value === true; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| obj = {}; |
| value = false; |
| |
| newBenchmark("IsExtensibleWithTrap", { |
| setup() { |
| p = new Proxy(obj, { |
| isExtensible: function(target) { |
| return true; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = Object.isExtensible(p); |
| } |
| return value; |
| }, |
| teardown() { |
| return value === true; |
| } |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| obj = {}; |
| value = false; |
| |
| newBenchmark("PreventExtensionsWithoutTrap", { |
| setup() { |
| p = new Proxy(obj, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = Object.preventExtensions(p); |
| } |
| return value; |
| }, |
| teardown() {} |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| obj = {}; |
| value = false; |
| |
| newBenchmark("PreventExtensionsWithTrap", { |
| setup() { |
| p = new Proxy(obj, { |
| preventExtensions: function(target) { |
| Object.preventExtensions(target); |
| return true; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = Object.preventExtensions(p); |
| } |
| return value; |
| }, |
| teardown() {} |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("GetPrototypeOfWithoutTrap", { |
| setup() { |
| p = new Proxy({}, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = Object.getPrototypeOf(p); |
| } |
| return value; |
| }, |
| teardown() {} |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("GetPrototypeOfWithTrap", { |
| setup() { |
| p = new Proxy({}, { |
| getPrototypeOf: function(target) { |
| return Array.prototype; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = Object.getPrototypeOf(p); |
| } |
| return value; |
| }, |
| teardown() {} |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("SetPrototypeOfWithoutTrap", { |
| setup() { |
| var obj = { x: 1 }; |
| obj.__proto__ = {}; |
| p = new Proxy(obj, {}); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = Object.setPrototypeOf(p, [1]); |
| } |
| return value; |
| }, |
| teardown() {} |
| }); |
| |
| // ---------------------------------------------------------------------------- |
| |
| newBenchmark("SetPrototypeOfWithTrap", { |
| setup() { |
| var obj = { x: 1 }; |
| obj.__proto__ = {}; |
| p = new Proxy(obj, { |
| setPrototypeOf: function(target, proto) { |
| Object.setPrototypeOf(target, proto); |
| return true; |
| } |
| }); |
| }, |
| run() { |
| for(var i = 0; i < ITERATIONS; i++) { |
| value = Object.setPrototypeOf(p, [1]); |
| } |
| return value; |
| }, |
| teardown() {} |
| }); |