-
-
Notifications
You must be signed in to change notification settings - Fork 34.1k
Description
What is the problem this feature will solve?
I have recently been working on optimizations for this implementation of Asynchronous iterators. I did a quick benchmark between that implementation; and the Readable API for Node v17.4.0 and found that some of the latest of our optimizations (yet to be released) we have are orders of magnitude faster than the Readable API. As an example, we can apply 10 maps to 200_000 elements in 20ms, whilst it takes the Readable API ~2s (tested on DELL XPS 15, 32 GB RAM).
import { ArrayIterator } from './dist/asynciterator.js'
import { Readable } from 'stream';
async function test(fn) {
let j = 0;
const arr = new Array(200_000).fill(true).map(() => j++);
let iterator = fn(arr)
for (let i = 0; i < 10; i++) {
iterator = iterator.map(x => x + 1)
}
const now = performance.now();
return await new Promise((res) => iterator.on('data', () => {}).on('end', () => {
res(performance.now() - now);
}))
}
console.log('ArrayIterator', await test(arr => new ArrayIterator(arr)));
console.log('Readable.from', await test(arr => Readable.from(arr)))| Implementation | Time (ms) |
|---|---|
| ArrayIterator | 20.243778005242348 |
| Readable.from | 2403.212348997593 |
The recent optimizations we have done include:
- Truncating arrays, and using linkedlists for internal buffers to get around performance issues with Array.shift in the V8 engine (Performance: make
Array.shiftanO(1)operation. #42449) - 'Pre-compiling' chained operations
This (somewhat long) issue is where we have had most of the discussion around the recent improvements we have been working on.
What is the feature you are proposing to solve the problem?
Use some of the optimizations already implemented in https://github.com/RubenVerborgh/AsyncIterator, RubenVerborgh/AsyncIterator#59
What alternatives have you considered?
No response