Last active
April 8, 2019 17:51
-
-
Save doasync/71d527479916cb0be5d9652785a6c96f to your computer and use it in GitHub Desktop.
Browser or Node.js JavaScript performance test (jsperf): for..in vs for + Object.keys vs for..of + Object.keys vs for..of + Object.entries
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Run each test in the new tab | |
const { performance, PerformanceObserver } = typeof window !== 'undefined' ? window : require('perf_hooks'); | |
function test() { | |
let objectSize = 30; | |
let iterations = 7000; | |
const values = { | |
'ENTRIES': 0, | |
'FOR-OF-KEYS': 0, | |
'FOR-KEYS': 0, | |
'FOR-IN': 0, | |
'FOR-IN-OWN': 0, | |
}; | |
const observer = new PerformanceObserver((items) => { | |
for (const entry of items.getEntries()) { | |
values[entry.name] += entry.duration; | |
} | |
console.log(Object.entries(values).sort((a, b) => a[1] - b[1])); | |
performance.clearMarks(); | |
observer.disconnect(); | |
}); | |
observer.observe({ entryTypes: ['measure'], buffered: true }); | |
function generateObject() { | |
let obj = {}; | |
for (let i = 0; i < objectSize; i++) { | |
obj['key-blabla' + i] = 'val' + i; | |
} | |
return obj; | |
} | |
console.log( | |
'Starting performance test with %d object size and %d iterations', | |
objectSize, | |
iterations, | |
); | |
for (let i = 0; i < iterations; i++) { | |
let obj = generateObject(); | |
// Object.entries | |
performance.mark('A'); | |
for(const [key, value] of Object.entries(obj)) { | |
key + value | |
}; | |
performance.mark('B'); | |
performance.measure('ENTRIES', 'A', 'B'); | |
// Object.Keys | |
performance.mark('A'); | |
for (const key of Object.keys(obj)) { | |
key + obj[key]; | |
} | |
performance.mark('B'); | |
performance.measure('FOR-OF-KEYS', 'A', 'B'); | |
// For | |
performance.mark('A'); | |
for (let i = 0, keys = Object.keys(obj), len = keys.length; i < len; i++) { | |
keys[i] + obj[keys[i]]; | |
} | |
performance.mark('B'); | |
performance.measure('FOR-KEYS', 'A', 'B'); | |
// For In | |
performance.mark('A'); | |
for (const key in obj) { | |
key + obj[key]; | |
} | |
performance.mark('B'); | |
performance.measure('FOR-IN', 'A', 'B'); | |
// For In + Own | |
performance.mark('A'); | |
for (const key in obj) { | |
if (obj.hasOwnProperty(key)) { | |
key + obj[key]; | |
} | |
} | |
performance.mark('B'); | |
performance.measure('FOR-IN-OWN', 'A', 'B'); | |
} | |
} | |
test(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment