Initial commit
This commit is contained in:
commit
5eb60db655
7 changed files with 171 additions and 0 deletions
5
README.md
Normal file
5
README.md
Normal 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
60
bench.js
Normal 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
3
index.html
Normal 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
4
package.json
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"name": "js-rnage",
|
||||
"type": "module"
|
||||
}
|
||||
51
range.js
Normal file
51
range.js
Normal 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
25
results.txt
Normal 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
23
test.js
Normal 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');
|
||||
Loading…
Add table
Add a link
Reference in a new issue