Initial commit

This commit is contained in:
Brooke Vibber 2025-12-13 10:37:19 -08:00
commit 5eb60db655
7 changed files with 171 additions and 0 deletions

5
README.md Normal file
View file

@ -0,0 +1,5 @@
js-range experiments
run benchmark.js or index in tests
comparing for loops against iterators

60
bench.js Normal file
View file

@ -0,0 +1,60 @@
import {
rangeGenerator,
rangeObjectProperty,
rangeClosure
} from './range.js';
const thousand = 1000;
const million = 1000000;
function benchmark(func) {
const iters = 100 * thousand;
// pre-heat jit
for (let i = 0; i < iters; i++) {
func();
}
let start = performance.now();
for (let i = 0; i < iters; i++) {
func();
}
let delta = (performance.now() - start) / iters;
console.log(`${delta * thousand} us per loop`);
}
function testFor() {
benchmark(() => {
let acc = 0;
for (let i = 0; i < thousand; i++) {
acc += i;
}
return acc;
});
}
function testOne(func) {
benchmark(() => {
let acc = 0;
for (let i of func(thousand)) {
acc += i;
}
return acc;
});
}
console.log('raw for loop');
testFor();
console.log('\n');
console.log('rangeGenerator');
testOne(rangeGenerator);
console.log('\n');
console.log('rangeObjectProperty');
testOne(rangeObjectProperty);
console.log('\n');
console.log('rangeClosure');
testOne(rangeClosure);
console.log('\n');

3
index.html Normal file
View file

@ -0,0 +1,3 @@
<script type="module" src="bench.js" async></script>
<p>look in console for the benchmark results</p>

4
package.json Normal file
View file

@ -0,0 +1,4 @@
{
"name": "js-rnage",
"type": "module"
}

51
range.js Normal file
View file

@ -0,0 +1,51 @@
export function *rangeGenerator(max) {
for (let i = 0; i < max; i++) {
yield i;
}
}
function rangeObjectPropertyNext() {
if (this.value < this.max) {
return {
value: this.value++
}
}
return {
done: true
}
}
function rangeObjectPropertyIterator() {
return {
value: 0,
max: this.max,
next: rangeObjectPropertyNext
};
}
export function rangeObjectProperty(max) {
return {
max,
[Symbol.iterator]: rangeObjectPropertyIterator
};
}
export function rangeClosure(max) {
let value = 0;
return {
[Symbol.iterator]() {
return {
next() {
if (value < max) {
return {
value: value++
};
}
return {
done: true
};
}
};
}
};
}

25
results.txt Normal file
View file

@ -0,0 +1,25 @@
macbook air m1 chrome
raw for loop
- node: 0.64 us
- chrome: 0.64 us
- firefox: 0.63 us
- safari: 3.89 us
rangeGenerator
- node: 17.08 us
- chrome: 17.08 us
- firefox: 35.06 us
- safari: 28.89 us
rangeObjectProperty
- node: 6.55 us
- chrome: 5.55 us
- firefox: 5.91 us
- safari: 23.91 us
rangeClosure
- node: 6.76 us
- chrome: 5.76 us
- firefox: 6.41 us
- safari: 24.79 us

23
test.js Normal file
View file

@ -0,0 +1,23 @@
import {
rangeGenerator,
rangeObjectProperty,
rangeClosure
} from './range.js';
function testOne(func) {
for (let i of func(10)) {
console.log(i);
}
}
console.log('rangeGenerator');
testOne(rangeGenerator);
console.log('\n');
console.log('rangeObjectProperty');
testOne(rangeObjectProperty);
console.log('\n');
console.log('rangeClosure');
testOne(rangeClosure);
console.log('\n');