| |
| function assert(b) { |
| if (!b) |
| throw new Error("Bad assertion."); |
| } |
| noInline(assert); |
| |
| let objs = []; |
| let keyPool = []; |
| let symbolPool = []; |
| const numKeys = 300; |
| for (let i = 0; i < numKeys; ++i) { |
| keyPool.push(i + "foo"); |
| symbolPool.push(Symbol("Foo")); |
| } |
| |
| for (let i = 0; i < 2000; i++) { |
| let num = (Math.random() * numKeys) | 0; |
| let o = {}; |
| for (let i = 0; i < num; ++i) { |
| o[keyPool[i]] = 25; |
| o[symbolPool[i]] = 40; |
| } |
| objs.push(o); |
| } |
| |
| let time = 0; |
| function foo(o) { |
| let props = Object.getOwnPropertyNames(o); |
| props.push(...Object.getOwnPropertySymbols(o)); |
| let start = Date.now(); |
| for (let i = 0; i < props.length; ++i) { |
| let s = props[i]; |
| assert(o.hasOwnProperty(s)); |
| } |
| time += Date.now() - start; |
| } |
| noInline(foo); |
| |
| for (let o of objs) { |
| foo(o); |
| } |
| const verbose = false; |
| if (verbose) |
| print(time); |