'use strict'; const common = require('../common.js'); const assert = require('assert'); const bench = common.createBenchmark(main, { n: [125], size: [500], extraProps: [0, 1], datasetName: [ 'objects', 'sets', 'setsWithObjects', 'maps', 'circularRefs', 'typedArrays', 'arrayBuffers', 'dataViewArrayBuffers', 'array', ], }); function createArray(length, extraProps) { if (extraProps) { return Array.from({ length: length * 4 }, (_, i) => i); } return Array.from({ length }, (_, i) => i * 4); } function createObjects(length, extraProps, depth = 0) { return Array.from({ length }, (_, i) => ({ foo: 'yarp', nope: { bar: '123', ...(extraProps ? { a: [1, 2, i] } : {}), c: {}, b: !depth ? createObjects(2, extraProps, depth + 1) : [], }, })); } function createSetsWithObjects(length, extraProps, depth = 0) { return Array.from({ length }, (_, i) => new Set([ ...(extraProps ? [{}] : []), { simple: 'object', number: i, }, ['array', 'with', 'values'], new Set([[], {}, { nested: i }]), ])); } function createSets(length, extraProps, depth = 0) { return Array.from({ length }, (_, i) => new Set([ 'yarp', ...(extraProps ? ['123', 1, 2] : []), i + 3, null, { simple: 'object', number: i, }, ['array', 'with', 'values'], !depth ? new Set([1, { nested: i }]) : new Set(), !depth ? createSets(2, extraProps, depth + 1) : null, ])); } function createMaps(length, extraProps, depth = 0) { return Array.from({ length }, (_, i) => new Map([ ...(extraProps ? [['primitiveKey', 'primitiveValue']] : []), [42, 'numberKey'], ['objectValue', { a: 1, b: i }], ['arrayValue', [1, 2, i]], ['nestedMap', new Map([['a', i], ['b', { deep: true }]])], [{ objectKey: true }, 'value from object key'], [[1, i, 3], 'value from array key'], [!depth ? createMaps(2, extraProps, depth + 1) : null, 'recursive value' + i], ])); } function createCircularRefs(length, extraProps) { return Array.from({ length }, (_, i) => { const circularSet = new Set(); const circularMap = new Map(); const circularObj = { name: 'circular object' }; circularSet.add('some value' + i); circularSet.add(circularSet); circularMap.set('self', circularMap); circularMap.set('value', 'regular value'); circularObj.self = circularObj; const objA = { name: 'A' }; const objB = { name: 'B' }; objA.ref = objB; objB.ref = objA; circularSet.add(objA); circularMap.set('objB', objB); return { circularSet, circularMap, ...extraProps ? { extra: i } : {}, circularObj, objA, objB, }; }); } function createTypedArrays(length, extraParts) { const extra = extraParts ? [9, 8, 7] : []; return Array.from({ length }, (_, i) => { return { uint8: new Uint8Array(new ArrayBuffer(32), 4, 4), int16: new Int16Array([1, 2, ...extra, 3]), uint32: new Uint32Array([i + 1, i + 2, ...extra, i + 3]), float64: new Float64Array([1.1, 2.2, ...extra, i + 3.3]), bigUint64: new BigUint64Array([1n, 2n, 3n]), }; }); } function createArrayBuffers(length, extra) { return Array.from({ length }, (_, n) => { const buffer = Buffer.alloc(n + (extra ? 1 : 0)); for (let i = 0; i < n; i++) { buffer.writeInt8(i % 128, i); } return buffer.buffer; }); } function createDataViewArrayBuffers(length, extra) { return createArrayBuffers(length, extra).map((buffer) => new DataView(buffer)); } const datasetMappings = { objects: createObjects, sets: createSets, setsWithObjects: createSetsWithObjects, maps: createMaps, circularRefs: createCircularRefs, typedArrays: createTypedArrays, arrayBuffers: createArrayBuffers, dataViewArrayBuffers: createDataViewArrayBuffers, array: createArray, }; function getDatasets(datasetName, size, extra) { return { actual: datasetMappings[datasetName](size, true), expected: datasetMappings[datasetName](size, !extra), }; } function main({ size, n, datasetName, extraProps }) { const { actual, expected } = getDatasets(datasetName, size, extraProps); bench.start(); for (let i = 0; i < n; ++i) { assert.partialDeepStrictEqual(actual, expected); } bench.end(n); }