'use strict'; const common = require('../common.js'); const { deepEqual, deepStrictEqual, notDeepEqual, notDeepStrictEqual } = require('assert'); const bench = common.createBenchmark(main, { n: [1e3], len: [2, 1e2], strict: [0, 1], order: ['insert', 'random', 'reversed'], method: [ 'deepEqual_primitiveOnly', 'deepEqual_objectOnly', 'deepEqual_mixed', 'notDeepEqual_primitiveOnly', 'notDeepEqual_objectOnly', 'notDeepEqual_mixed', ], }, { combinationFilter(p) { return p.order !== 'random' || p.strict === 1 && p.method !== 'notDeepEqual_objectOnly'; }, }); function shuffleArray(array) { for (let i = array.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); const temp = array[i]; array[i] = array[j]; array[j] = temp; } } function benchmark(method, n, values, values2, order) { const actual = new Set(values); // Prevent reference equal elements let deepCopy = JSON.parse(JSON.stringify(values2)); if (order === 'reversed') { deepCopy = deepCopy.reverse(); } else if (order === 'random') { shuffleArray(deepCopy); } const expected = new Set(deepCopy); bench.start(); for (let i = 0; i < n; ++i) { method(actual, expected); } bench.end(n); } function main({ n, len, method, strict, order }) { const array = Array.from({ length: len }, () => ''); switch (method) { case 'deepEqual_primitiveOnly': { const values = array.map((_, i) => `str_${i}`); benchmark(strict ? deepStrictEqual : deepEqual, n, values, values, order); break; } case 'deepEqual_objectOnly': { const values = array.map((_, i) => [`str_${i}`, null]); benchmark(strict ? deepStrictEqual : deepEqual, n, values, values, order); break; } case 'deepEqual_mixed': { const values = array.map((_, i) => { return i % 2 ? [`str_${i}`, null] : `str_${i}`; }); benchmark(strict ? deepStrictEqual : deepEqual, n, values, values, order); break; } case 'notDeepEqual_primitiveOnly': { const values = array.map((_, i) => `str_${i}`); const values2 = values.slice(0); values2[Math.floor(len / 2)] = 'w00t'; benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2, order); break; } case 'notDeepEqual_objectOnly': { const values = array.map((_, i) => [`str_${i}`, null]); const values2 = values.slice(0); values2[Math.floor(len / 2)] = ['w00t']; benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2, order); break; } case 'notDeepEqual_mixed': { const values = array.map((_, i) => { return i % 2 ? [`str_${i}`, null] : `str_${i}`; }); const values2 = values.slice(); values2[0] = 'w00t'; benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2, order); break; } default: throw new Error(`Unsupported method "${method}"`); } }