Skip to content

Instantly share code, notes, and snippets.

@SimonWoolf
Created December 16, 2019 17:32
Show Gist options
  • Save SimonWoolf/da4b31c1d39b5d3f57bbf3b8398c9360 to your computer and use it in GitHub Desktop.
Save SimonWoolf/da4b31c1d39b5d3f57bbf3b8398c9360 to your computer and use it in GitHub Desktop.
const ROUNDS = 1*5*1000;
let start;
const calls = new Map();
for(let i=0; i<10000; i++) {
calls.set(Math.random().toString(), {request: {params: {fromOtherMaster: 'true'}}, instance: 'foo'})
}
const reduceIterableWith = (fn, initial, iterable) => {
const iterator = iterable[Symbol.iterator]();
let iterationResult,
accumulator = initial;
while ((iterationResult = iterator.next(), !iterationResult.done)) {
accumulator = fn(accumulator, iterationResult.value);
}
return accumulator;
};
const filterIterableWith = (fn, iterable) => ({
[Symbol.iterator]: () => {
const iterator = iterable[Symbol.iterator]();
return {
next: () => {
let {done, value} = iterator.next();
while (!done && !fn(value)) {
({done, value} = iterator.next());
}
return {done, value};
}
}
}
});
const mapIterableWith = (fn, iterable) => ({
[Symbol.iterator]: () => {
const iterator = iterable[Symbol.iterator]();
return {
next: () => {
const {done, value} = iterator.next();
return ({done, value: done ? undefined : fn(value)});
}
}
}
});
start = new Date();
for(let i=0; i<ROUNDS; i++) {
const sites = new Set()
for(const call of calls.values()) {
if(call.request.params.fromOtherMaster === 'true') {
sites.add(call.request.instance);
}
}
if(sites.size === 0) {
console.log("never")
}
}
console.log("for-of", new Date() - start)
start = new Date();
for(let i=0; i<ROUNDS; i++) {
const sites = [...calls.values()].
filter(call => call.request.params.fromOtherMaster === 'true').
map(call => call.request.instance).
reduce((sites, site) => sites.add(site), new Set());
if(sites.size === 0) {
console.log("never")
}
}
console.log("functional", new Date() - start)
start = new Date();
for(let i=0; i<ROUNDS; i++) {
const sites = [...calls.values()].
reduce((sites, call) => {
if(call.request.params.fromOtherMaster === 'true') {
sites.add(call.request.instance);
}
return sites;
}, new Set());
if(sites.size === 0) {
console.log("never")
}
}
console.log("functional-reduce-only", new Date() - start)
start = new Date();
for(let i=0; i<ROUNDS; i++) {
const sites = reduceIterableWith((sites, site) => sites.add(site), new Set(), mapIterableWith(call => call.request.instance, filterIterableWith(call => call.request.params.fromOtherMaster === 'true', calls.values())))
if(sites.size === 0) {
console.log("never")
}
}
console.log("iterable-functional", new Date() - start)
start = new Date();
for(let i=0; i<ROUNDS; i++) {
const sites = reduceIterableWith((sites, call) => {
if(call.request.params.fromOtherMaster === 'true') {
sites.add(call.request.instance);
}
return sites;
}, new Set(), calls.values())
if(sites.size === 0) {
console.log("never")
}
}
console.log("iterable-functional-reduce-only", new Date() - start)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment