Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
Run results for:
custom_deepEqual vs. lodash.isEqual
Go to the benchmark
Embed
Embed Benchmark Result
Run details:
User agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0
Browser:
Chrome 138
Operating system:
Windows
Device Platform:
Desktop
Date tested:
11 months ago
Test name
Executions per second
lodash
1226577.1 Ops/sec
custom-deepEqual
1282822.8 Ops/sec
JSON.stringify()
1782061.5 Ops/sec
HTML Preparation code:
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>
Script Preparation code:
function deepEqual(obj1, obj2){ // Initialisation let obj1Keys = Object.keys(obj1); let obj2Keys = Object.keys(obj2); // Compare le nombre de propriétés if(obj1Keys.length != obj2Keys.length) return false; // Compare le nom des clés de chaque propriété let set = new Set([...obj1Keys, ...obj2Keys]); if(set.size != obj1Keys.length) return false; // Compare les valeurs { // Compare le type de chaque valeur let objValues = obj1Keys.map(key =>[obj1[key], obj2[key]]) let sameType = objValues.every( value => typeof value[0] === typeof value[1]); if(!sameType) return false; // Compare directement les valeurs let valueTypes = ['number', 'string', 'boolean', 'symbol', 'undefined', 'bigint']; let allTypes = [...valueTypes, 'null', 'object']; // On trie le tableau pour comparer en priorité les types valeurs, puis les types références (qui impliquent une récursion) let objValuesTypeSorted = objValues.sort((a, b) => allTypes.indexOf(typeof a[0]) - allTypes.indexOf(typeof b[0])); // On utilise every() pour sortir de la méthode dès qu'une différence est relevée var sameValues = objValuesTypeSorted.every(values => { // Compare les types valeurs if(valueTypes.includes(typeof values[0])) return values[0] === values[1]; // Compare les types objets else { if (values[0] === null && values[1] === null) return true; else if(values[0] === null && values[1] !== null || values[1] === null && values[0] !== null) return false; else return deepEqual(values[0], values[1]); } }) } if(!sameValues) return false; return true; } // 1 level deep window.foo1 = { a: 1, b: 2, c: { a: 1, b: 2, c: { a: 1, b: 2 } } }; window.bar1 = { a: 1, b: 3, c: { a: 1, b: 2, c: { a: 1, b: 2 } } }; // 2 levels deep window.foo2 = { a: 1, b: 2, c: { a: 1, b: 2, c: { a: 1, b: 2 } } }; window.bar2 = { a: 1, b: 2, c: { a: 1, b: 3, c: { a: 1, b: 2 } } }; // 3 levels deep window.foo3 = { a: 1, b: 2, c: { a: 1, b: 2, c: { a: 1, b: 2 } } }; window.bar3 = { a: 1, b: 2, c: { a: 1, b: 2, c: { a: 1, b: 4 } } };
Tests:
lodash
_.isEqual(window.foo1, window.bar1)
custom-deepEqual
deepEqual(window.foo1, window.bar1);
JSON.stringify()
JSON.stringify(window.foo1) === JSON.stringify(window.bar1);