1'use strict'; 2 3const common = require('../common.js'); 4const { deepEqual, deepStrictEqual, notDeepEqual, notDeepStrictEqual } = 5 require('assert'); 6 7const bench = common.createBenchmark(main, { 8 n: [5e2], 9 len: [5e2], 10 strict: [0, 1], 11 method: [ 12 'deepEqual_primitiveOnly', 13 'deepEqual_objectOnly', 14 'deepEqual_mixed', 15 'notDeepEqual_primitiveOnly', 16 'notDeepEqual_objectOnly', 17 'notDeepEqual_mixed', 18 ], 19}); 20 21function benchmark(method, n, values, values2) { 22 const actual = new Set(values); 23 // Prevent reference equal elements 24 const deepCopy = JSON.parse(JSON.stringify(values2 ? values2 : values)); 25 const expected = new Set(deepCopy); 26 bench.start(); 27 for (let i = 0; i < n; ++i) { 28 method(actual, expected); 29 } 30 bench.end(n); 31} 32 33function main({ n, len, method, strict }) { 34 const array = Array(len).fill(1); 35 36 switch (method) { 37 case 'deepEqual_primitiveOnly': { 38 const values = array.map((_, i) => `str_${i}`); 39 benchmark(strict ? deepStrictEqual : deepEqual, n, values); 40 break; 41 } 42 case 'deepEqual_objectOnly': { 43 const values = array.map((_, i) => [`str_${i}`, null]); 44 benchmark(strict ? deepStrictEqual : deepEqual, n, values); 45 break; 46 } 47 case 'deepEqual_mixed': { 48 const values = array.map((_, i) => { 49 return i % 2 ? [`str_${i}`, null] : `str_${i}`; 50 }); 51 benchmark(strict ? deepStrictEqual : deepEqual, n, values); 52 break; 53 } 54 case 'notDeepEqual_primitiveOnly': { 55 const values = array.map((_, i) => `str_${i}`); 56 const values2 = values.slice(0); 57 values2[Math.floor(len / 2)] = 'w00t'; 58 benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2); 59 break; 60 } 61 case 'notDeepEqual_objectOnly': { 62 const values = array.map((_, i) => [`str_${i}`, null]); 63 const values2 = values.slice(0); 64 values2[Math.floor(len / 2)] = ['w00t']; 65 benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2); 66 break; 67 } 68 case 'notDeepEqual_mixed': { 69 const values = array.map((_, i) => { 70 return i % 2 ? [`str_${i}`, null] : `str_${i}`; 71 }); 72 const values2 = values.slice(); 73 values2[0] = 'w00t'; 74 benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2); 75 break; 76 } 77 default: 78 throw new Error(`Unsupported method "${method}"`); 79 } 80} 81