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 Map(values); 23 // Prevent reference equal elements 24 const deepCopy = JSON.parse(JSON.stringify(values2 ? values2 : values)); 25 const expected = new Map(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}`, 123]); 39 benchmark(strict ? deepStrictEqual : deepEqual, n, values); 40 break; 41 } 42 case 'deepEqual_objectOnly': { 43 const values = array.map((_, i) => [[`str_${i}`, 1], 123]); 44 benchmark(strict ? deepStrictEqual : deepEqual, n, values); 45 break; 46 } 47 case 'deepEqual_mixed': { 48 const values = array.map( 49 (_, i) => [i % 2 ? [`str_${i}`, 1] : `str_${i}`, 123], 50 ); 51 benchmark(strict ? deepStrictEqual : deepEqual, n, values); 52 break; 53 } 54 case 'notDeepEqual_primitiveOnly': { 55 const values = array.map((_, i) => [`str_${i}`, 123]); 56 const values2 = values.slice(0); 57 values2[Math.floor(len / 2)] = ['w00t', 123]; 58 benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2); 59 break; 60 } 61 case 'notDeepEqual_objectOnly': { 62 const values = array.map((_, i) => [[`str_${i}`, 1], 123]); 63 const values2 = values.slice(0); 64 values2[Math.floor(len / 2)] = [['w00t'], 123]; 65 benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2); 66 break; 67 } 68 case 'notDeepEqual_mixed': { 69 const values = array.map( 70 (_, i) => [i % 2 ? [`str_${i}`, 1] : `str_${i}`, 123], 71 ); 72 const values2 = values.slice(0); 73 values2[0] = ['w00t', 123]; 74 benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2); 75 break; 76 } 77 default: 78 throw new Error(`Unsupported method ${method}`); 79 } 80} 81