function copyUsingArrayDestructuring(arr) {
return [...arr]
}
function copyArrayInForOfLoop(array) {
const clone = []
for (const item of array) {
clone.push(item)
}
return clone
}
function copyArrayUsingMap(arr) {
return arr.map((x) => x)
}
function copyArrayOneByOne(arr) {
const clone = []
for (let i = 0; i <= arr.length; i++) {
clone[i] = arr[i]
}
return clone
}
function copyArrayFromTheEnd(arr) {
const clone = []
for (let i = arr.length - 1; i >= 0; i--) {
clone[i] = arr[i]
}
return clone
}
function copyUsingIteratingOverProperties(obj) {
const clone = {}
for (const property in obj) {
clone[property] = obj[property]
}
return clone
}
function copyUsingObjectAssign(obj) {
return Object.assign({}, obj)
}
function copyUsingObjectDestructuring(obj) {
return { ...obj }
}
function copyUsingJson(arr) {
return JSON.parse(JSON.stringify(arr))
}
const millionItems = Array.from(Array(1000000), (_, i) => i)
function runMillionOnce(fn) {
const start = performance.now()
fn(millionItems)
return performance.now() - start
}
const thousandItems = Array.from(Array(1000), (_, i) => i)
async function runThousandThousandTimesSync(fn) {
const start = performance.now()
for (let j = 1; j <= 1000; j++) {
fn(thousandItems)
}
return performance.now() - start
}
async function runThousandThousandTimesAsync(fn) {
const start = performance.now()
const promises = []
for (let j = 1; j <= 1000; j++) {
promises.push(() => fn(thousandItems))
}
await Promise.all(promises)
return performance.now() - start
}
async function run(title, runFn, functions) {
console.log()
console.log(title)
for (const fn of functions) {
for (let i = 1; i <= 3; i++) {
const time = await runFn(fn)
console.log(`${fn.name} ${i}: ${Math.round(time)}ms`)
}
}
}
async function main() {
const functions = [
copyUsingArrayDestructuring,
copyArrayOneByOne,
copyArrayUsingMap,
copyArrayInForOfLoop,
copyArrayFromTheEnd,
copyUsingJson,
copyUsingIteratingOverProperties,
copyUsingObjectAssign,
copyUsingObjectDestructuring,
]
await run("Million once", runMillionOnce, functions)
await run(
"Thousand thousand times sync",
runThousandThousandTimesSync,
functions,
)
await run(
"Thousand thousand times async",
runThousandThousandTimesAsync,
functions,
)
}
main()
"Million once"
Promise {}"copyUsingArrayDestructuring 1: 4ms"
"copyUsingArrayDestructuring 2: 2ms"
"copyUsingArrayDestructuring 3: 2ms"
"copyArrayOneByOne 1: 18ms"
"copyArrayOneByOne 2: 17ms"
"copyArrayOneByOne 3: 12ms"
"copyArrayUsingMap 1: 12ms"
"copyArrayUsingMap 2: 14ms"
"copyArrayUsingMap 3: 11ms"
"copyArrayInForOfLoop 1: 24ms"
"copyArrayInForOfLoop 2: 24ms"
"copyArrayInForOfLoop 3: 23ms"
"copyArrayFromTheEnd 1: 48ms"
"copyArrayFromTheEnd 2: 45ms"
"copyArrayFromTheEnd 3: 39ms"
"copyUsingJson 1: 42ms"
"copyUsingJson 2: 49ms"
"copyUsingJson 3: 55ms"
"copyUsingIteratingOverProperties 1: 100ms"
"copyUsingIteratingOverProperties 2: 114ms"
"copyUsingIteratingOverProperties 3: 88ms"
"copyUsingObjectAssign 1: 254ms"
"copyUsingObjectAssign 2: 312ms"
"copyUsingObjectAssign 3: 258ms"
"copyUsingObjectDestructuring 1: 243ms"
"copyUsingObjectDestructuring 2: 229ms"
"copyUsingObjectDestructuring 3: 235ms"
"Thousand thousand times sync"
"copyUsingArrayDestructuring 1: 15ms"
"copyUsingArrayDestructuring 2: 0ms"
"copyUsingArrayDestructuring 3: 0ms"
"copyArrayOneByOne 1: 4ms"
"copyArrayOneByOne 2: 3ms"
"copyArrayOneByOne 3: 3ms"
"copyArrayUsingMap 1: 8ms"
"copyArrayUsingMap 2: 9ms"
"copyArrayUsingMap 3: 7ms"
"copyArrayInForOfLoop 1: 5ms"
"copyArrayInForOfLoop 2: 3ms"
"copyArrayInForOfLoop 3: 4ms"
"copyArrayFromTheEnd 1: 10ms"
"copyArrayFromTheEnd 2: 9ms"
"copyArrayFromTheEnd 3: 10ms"
"copyUsingJson 1: 16ms"
"copyUsingJson 2: 16ms"
"copyUsingJson 3: 20ms"
"copyUsingIteratingOverProperties 1: 32ms"
"copyUsingIteratingOverProperties 2: 28ms"
"copyUsingIteratingOverProperties 3: 27ms"
"copyUsingObjectAssign 1: 124ms"
"copyUsingObjectAssign 2: 102ms"
"copyUsingObjectAssign 3: 105ms"
"copyUsingObjectDestructuring 1: 124ms"
"copyUsingObjectDestructuring 2: 116ms"
"copyUsingObjectDestructuring 3: 127ms"
"Thousand thousand times async"
"copyUsingArrayDestructuring 1: 0ms"
"copyUsingArrayDestructuring 2: 0ms"
"copyUsingArrayDestructuring 3: 0ms"
"copyArrayOneByOne 1: 0ms"
"copyArrayOneByOne 2: 0ms"
"copyArrayOneByOne 3: 0ms"
"copyArrayUsingMap 1: 0ms"
"copyArrayUsingMap 2: 0ms"
"copyArrayUsingMap 3: 0ms"
"copyArrayInForOfLoop 1: 0ms"
"copyArrayInForOfLoop 2: 0ms"
"copyArrayInForOfLoop 3: 0ms"
"copyArrayFromTheEnd 1: 0ms"
"copyArrayFromTheEnd 2: 0ms"
"copyArrayFromTheEnd 3: 0ms"
"copyUsingJson 1: 0ms"
"copyUsingJson 2: 0ms"
"copyUsingJson 3: 0ms"
"copyUsingIteratingOverProperties 1: 0ms"
"copyUsingIteratingOverProperties 2: 0ms"
"copyUsingIteratingOverProperties 3: 0ms"
"copyUsingObjectAssign 1: 0ms"
"copyUsingObjectAssign 2: 0ms"
"copyUsingObjectAssign 3: 0ms"
"copyUsingObjectDestructuring 1: 0ms"
"copyUsingObjectDestructuring 2: 0ms"
"copyUsingObjectDestructuring 3: 0ms"