Tomasz Ducin
independent consultant, architect, developer, trainer, speaker #architecture #performance #javascript #typescript #react #angular
Independent Consultant & Software Architect
Trainer, Speaker, Frontend & Backend
Bottega IT Minds, ArchitekturaNaFroncie.pl (ANF)
Warsaw, PL
const items = ['a', 'b', 'c']
function *map(iterable, mapperFn){
for (item of iterable){
const newItem = mapperFn(item)
yield newItem
}
}
const uppercasedIterator =
map(items, str => str.toUpperCase())
// LAZY
const uppercased = map(items, str => str.toUpperCase())
uppercased.next() // {value: 'A', done: false}
uppercased.next() // {value: 'B', done: false}
uppercased.next() // {value: 'C', done: false}
uppercased.next() // {value: undefined, done: true}
// EAGER
const uppercased = map(items, str => str.toUpperCase())
[...uppercased] // ['A', 'B', 'C']
iter.next()
iter.next()
iter.next()
array ops vs iterator ops
🚀 test #1
📦 small data set: array(50)
🔨 no operations
👉 ~400 ops (iter) vs ~400 ops (arr)
VERDICT: no clear winner, results are NON reproducible
🚀 test #2
📦 small data set: array(50)
🔨 4 x map (trivial op)
👉 330k ops (iter) vs ~4k ops (arr)
VERDICT: iterators 99% times faster
🚀 test #3
📦 bigger data set: array(500)
🔨 4 x map (trivial op)
👉 ~300k ops (iter) vs ~400 ops (arr)
VERDICT: iterators 100% times faster
🚀 test #4
📦 super small data set: array(5)
🔨 4 x map (trivial op)
👉 ~275k ops (iter) vs ~4k ops (arr)
VERDICT: iterators 98% times faster
🚀 SANITY CHECK: iterators only
📦 bigger data set: array(500)
🔨 1*map vs 2*map vs 4*map vs 8*map
👉 ~475k ops (1) vs ~350k ops (2) vs ~225k ops (4) vs ~150k ops (8)
🚀 SANITY CHECK: iterators only
📦 bigger data set: array(500)
🔨 1*map vs 2*map vs 4*map vs 8*map
👉 ~475k ops (1) vs ~350k ops (2) vs ~225k ops (4) vs ~150k ops (8)
🚀 SANITY CHECK: iterators only
📦 bigger data set: array(500)
🔨 1*map vs 2*map vs 4*map vs 8*map
👉 ~475k ops (1) vs ~350k ops (2) vs ~225k ops (4) vs ~150k ops (8)
🚀 SANITY CHECK: iterators only
📦 bigger data set: array(500)
🔨 1*map vs 2*map vs 4*map vs 8*map
👉 ~475k ops (1) vs ~350k ops (2) vs ~225k ops (4) vs ~150k ops (8)
VERDICT: 1*map < 2*map < 4*map < 8*map
(less ops => faster, no sh__ Sherlock)
my benchmark is more benchmarkish than your benchmark
const items = ['a', 'b', 'c']
function *map(iterable, mapperFn){
for (item of iterable){
const newItem = mapperFn(item)
yield newItem
}
}
const uppercasedIterator =
map(items, str => str.toUpperCase())
https://github.com/tc39/proposal-iterator-helpers
array.values() -> ArrayIterator
set.values() -> SetIterator
map.keys() -> MapIterator
map.values() -> MapIterator
etc...
even
Object.keys(OBJ).values() -> ArrayIterator
By Tomasz Ducin
independent consultant, architect, developer, trainer, speaker #architecture #performance #javascript #typescript #react #angular