import { unlinkSync } from 'node:fs';
-import { benchmark } from './utils.js';
+import { benchmark, benchmarkIterations } 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));
+let iter = 0;
+await benchmarkIterations('Write 1MB', 20, async () => {
+ await createRandomCSV(1000, 100, iter++).pipeTo(new CSVWriter(temp));
+});
+
+await benchmarkIterations('Read 1MB', 20, async () => {
+ const r = new CSVReader(temp);
+ for await (const _ of r) { }
+});
+
+iter = 0
+await benchmarkIterations('Transform 1MB', 20, async () => {
+ const r = createRandomCSV(1000, 100, iter++).pipeThrough(new CSVTransformer(r => r.map(f => Number(f) + 1)));
+ for await (const _ of r) { }
+});
+
await benchmark('Write 100MB', async () => {
await createRandomCSV(100000, 100, 2).pipeTo(new CSVWriter(temp));
});
performance.clearMarks();
performance.clearMeasures();
}
+
+export async function benchmarkIterations(name, iterations, fn) {
+ for (let i = 0; i < iterations; i++) {
+ performance.mark(`start:${i}`);
+ await fn();
+ performance.mark(`end:${i}`);
+ performance.measure(`measure:${i}`, `start:${i}`, `end:${i}`);
+ };
+
+ const measures = performance.getEntriesByType('measure');
+ const average = measures.reduce(((a, c) => a + c.duration), 0) / measures.length;
+
+ console.log(`${styleText('green', name)} | ${styleText(['yellow', 'underline'], `${average.toFixed(3)}ms`)} average execution time in ${styleText(['yellow', 'underline'], iterations.toString())} iterations`);
+
+ performance.clearMarks();
+ performance.clearMeasures();
+}