const {performance} = require('perf_hooks'); // Create 1000 random numbers const arr = length => Array.from({length}, () => Math.floor(Math.random() * 1000)); function record(arr) { const result = []; function timeRun(callback, message) { const start = performance.now(); callback(); const end = performance.now(); result.push({ type: message, time: end - start, }); } timeRun(() => { for (let i = 0, length = arr.length; i < length; i++) {} }, 'for ++'); timeRun(() => { for (let i = 0, length = arr.length; i < length; ++i) {} }, '++ for'); timeRun(() => { for (let i = 0, length = arr.length; i !== length; i++) {} }, 'for !== ++'); timeRun(() => { for (let i = 0, length = arr.length; i !== length; ++i) {} }, '++ for !=='); timeRun(() => { for (let length = arr.length, i = length - 1; i >= 0; i--) {} }, 'for --'); timeRun(() => { for (let length = arr.length, i = length - 1; i >= 0; --i) {} }, '-- for'); timeRun(() => { for (let i = arr.length; i--; ) {} }, 'for i length --'); timeRun(() => { for (let i = arr.length; --i; ) {} }, '--for i length'); timeRun(() => { arr.map(i => i); }, 'map'); timeRun(() => { for (const i of arr) { } }, 'for of'); timeRun(() => { arr.flatMap(i => [i]); }, 'flatMap'); timeRun(() => { for (const i in arr) { Object.prototype.hasOwnProperty.call(arr, i); } }, 'for in'); timeRun(() => { arr.forEach(() => {}); }, 'forEach'); timeRun(() => { [].forEach.call(arr, () => {}); }, 'forEach call'); timeRun(() => { Array.from(arr, () => {}); }, 'Array from'); timeRun(() => { Object.keys(arr).map(i => i); }, 'Object.keys map'); timeRun(() => { let length = arr.length; while (length--) {} }, 'while forward --'); timeRun(() => { let length = arr.length; while (--length) {} }, '--while forward'); timeRun(() => { let length = arr.length; do { length--; } while (length); }, 'do while forward --'); timeRun(() => { let length = arr.length; do { --length; } while (length); }, '--do while forward'); timeRun(() => { let i = 0; while (i < arr.length) { i++; } }, 'while ++'); timeRun(() => { let i = 0; while (i < arr.length) { ++i; } }, '++ while'); timeRun(() => { let i = 0; do { i++; } while (i < arr.length); }, 'do while ++'); timeRun(() => { let i = 0; do { ++i; } while (i < arr.length); }, '++ do while'); timeRun(() => { let i = arr.length; while (--i >= 0) {} }, '--while >= 0'); timeRun(() => { while (arr.shift()) {} }, 'while shift'); const arrClone = [...arr]; timeRun(() => { for (let i; (i = arrClone.pop()); ) {} }, 'pop'); result.sort((a, b) => a.time - b.time); console.log(`Best: ${result[0].type}: ${result[0].time}ms`); console.table(result); } console.log('arr with 100 elements'); // --while forward: 0.013000000268220901ms record(arr(100)); console.log('arr with 1000 elements'); // do while forward --: 0.006699997931718826ms record(arr(1000)); console.log('arr with 10_000 elements'); // pop: 0.0020000003278255463ms record(arr(10_000)); console.log('arr with 100_000 elements'); // pop: 0.012400001287460327ms record(arr(100_000)); console.log('arr with 1_000_000 elements'); // pop: 0.01029999926686287ms record(arr(1_000_000)); console.log('arr with 10_000_000 elements'); // pop: 0.007999997586011887ms record(arr(10_000_000));