--- /dev/null
+import { unlinkSync } from 'node:fs';
+
+import { benchmark } from './utils.js';
+import { CSVReader, CSVTransformer, CSVWriter } from '../src/index.js';
+import { createRandomCSV, createTempFile } from '../test/utils.js';
+
+const temp = await createTempFile();
+process.on('exit', () => unlinkSync(temp));
+
+await benchmark('Write 100MB', async () => {
+ await createRandomCSV(100000, 100, 2).pipeTo(new CSVWriter(temp));
+});
+
+await benchmark('Read 100MB', async () => {
+ const r = new CSVReader(temp);
+ for await (const _ of r) { }
+});
+
+await benchmark('Transform 100MB', async () => {
+ const r = createRandomCSV(100000, 100, 2).pipeThrough(new CSVTransformer(r => r.map(f => Number(f) + 1)));
+ for await (const _ of r) { }
+});
--- /dev/null
+import { styleText } from 'node:util';
+
+export async function benchmark(name, fn) {
+ performance.mark('start');
+ await fn();
+ performance.mark('end');
+ performance.measure('measure', 'start', 'end');
+
+ const measures = performance.getEntriesByType('measure');
+ const { duration } = measures[0];
+
+ console.log(`${styleText('green', name)} | ${styleText(['yellow', 'underline'], `${duration.toFixed(3)}ms`)} execution time`);
+
+ performance.clearMarks();
+ performance.clearMeasures();
+}
"scripts": {
"test": "node --test --test-skip-pattern=\"/^large:*/\"",
"test:large": "node --test --test-name-pattern=\"/^large:*/\"",
- "test:coverage": "npm run test -- --experimental-test-coverage"
+ "test:coverage": "npm run test -- --experimental-test-coverage",
+ "bench": "node ./benchmark/core.bench.js"
}
}