Skip to content

Instantly share code, notes, and snippets.

@webstrand
Created February 20, 2025 17:24
Show Gist options
  • Save webstrand/9c33c9493f6a07c1a63893bd15f31692 to your computer and use it in GitHub Desktop.
Save webstrand/9c33c9493f6a07c1a63893bd15f31692 to your computer and use it in GitHub Desktop.
import { bench, do_not_optimize, run } from './node_modules/mitata/src/main.mjs';
const ub = 100_000;
const adHoc = {
[Symbol.iterator]() {
return {
i: 0,
next() {
return this.i < ub ? { value: this.i++ } : { done: true }
}
}
}
}
const adHocReuse = {
[Symbol.iterator]() {
const result = { value: 0, done: false }
return {
i: 0,
next() {
if(this.i < ub) {
result.value = this.i++;
return result;
}
result.done = true;
return result;
}
}
}
}
const native = {
data: Array.from({ length: ub }, (_, i) => i),
[Symbol.iterator]() {
return this.data.values();
}
}
const generator = {
*[Symbol.iterator]() {
for(let i = 0; i < ub; i++) yield i;
}
}
const generatorDelegation = {
data: Array.from({ length: ub }, (_, i) => i),
*[Symbol.iterator]() {
yield* this.data;
}
}
bench(`0 .. ${ub} native`, () => {
let i = 0;
for(let j of native) {
i += j;
}
return do_not_optimize(i)
});
bench(`0 .. ${ub} ad-hoc`, () => {
let i = 0;
for(let j of adHoc) {
i += j!;
}
return do_not_optimize(i)
});
bench(`0 .. ${ub} ad-hocreusing IteratorResult`, () => {
let i = 0;
for(let j of adHocReuse) {
i += j!;
}
return do_not_optimize(i)
});
bench(`0 .. ${ub} generator`, () => {
let i = 0;
for(let j of generator) {
i += j!;
}
return do_not_optimize(i)
});
bench(`0 .. ${ub} generator delegation`, () => {
let i = 0;
for(let j of generatorDelegation) {
i += j!;
}
return do_not_optimize(i)
});
await run();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment