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