From 18bd4188a2e18421a1647b7b891dbe2d7925ef77 Mon Sep 17 00:00:00 2001 From: Balearica Date: Fri, 20 Dec 2024 22:15:29 -0800 Subject: [PATCH] Added memory benchmark (#979) --- .eslintrc | 3 +- benchmarks/node/memory-benchmark.js | 61 +++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 benchmarks/node/memory-benchmark.js diff --git a/.eslintrc b/.eslintrc index c214f0992..399db7e8b 100644 --- a/.eslintrc +++ b/.eslintrc @@ -18,6 +18,7 @@ "no-restricted-syntax": ["error", "ForInStatement", "LabeledStatement", "WithStatement"], // The `prefer-destructuring` rule causes issues // https://github.com/naptha/tesseract.js/issues/847 - "prefer-destructuring": 0 + "prefer-destructuring": 0, + "no-plusplus": ["error", { "allowForLoopAfterthoughts": true }] } } diff --git a/benchmarks/node/memory-benchmark.js b/benchmarks/node/memory-benchmark.js new file mode 100644 index 000000000..d62b07f3c --- /dev/null +++ b/benchmarks/node/memory-benchmark.js @@ -0,0 +1,61 @@ +#!/usr/bin/env node +const path = require('path'); +const { createWorker, createScheduler } = require('../../src'); + +const formatBytes = (bytes) => `${(bytes / 1024 / 1024).toFixed(2)} MB`; +const formatTime = (seconds) => `${seconds.toFixed(2)}s`; + +const getMemoryRow = (iteration, memUsage, time) => `| ${iteration} | ${formatTime(time)} | ${formatBytes(memUsage.heapUsed)} | ${formatBytes(memUsage.heapTotal)} | ${formatBytes(memUsage.rss)} | ${formatBytes(memUsage.external)} |`; + +const scheduler = createScheduler(); + +if (!global.gc) { + console.log('Garbage collection unavailable. Pass --expose-gc ' + + 'when launching node to enable forced garbage collection.'); +} + +const workerGen = async () => { + const worker = await createWorker('eng', 1, { cachePath: '.' }); + scheduler.addWorker(worker); +}; + +(async () => { + const fileArr = [ + path.join(__dirname, '..', 'data', 'meditations.jpg'), + path.join(__dirname, '..', 'data', 'tyger.jpg'), + path.join(__dirname, '..', 'data', 'testocr.png'), + ]; + + const workerN = 4; + const resArr = Array(workerN); + for (let i = 0; i < workerN; i++) { + resArr[i] = workerGen(); + } + await Promise.all(resArr); + + // Print table header + console.log('| Iteration | Time | Heap Used | Heap Total | RSS | External |'); + console.log('|-----------|------|------------|------------|-----|----------|'); + + for (let i = 0; i < 10; i++) { + let iterationTime = 0; + for (const file of fileArr) { + const time1 = Date.now(); + const promises = []; + for (let j = 0; j < 10; j++) { + promises.push(scheduler.addJob('recognize', file)); + } + // eslint-disable-next-line no-await-in-loop + await Promise.all(promises); + + if (global.gc) global.gc(); + + const time2 = Date.now(); + const timeDif = (time2 - time1) / 1e3; + iterationTime += timeDif; + } + // Print memory stats and time after each iteration + console.log(getMemoryRow(i + 1, process.memoryUsage(), iterationTime)); + } + scheduler.terminate(); +})();