Skip to content

Instantly share code, notes, and snippets.

@doasync
Last active April 8, 2019 17:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save doasync/71d527479916cb0be5d9652785a6c96f to your computer and use it in GitHub Desktop.
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
// 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