Skip to content

Commit

Permalink
Merge pull request #30 from alexbbt/benchmark
Browse files Browse the repository at this point in the history
  • Loading branch information
alexbbt authored Apr 4, 2022
2 parents 68d65b8 + 8c086bf commit abd6728
Show file tree
Hide file tree
Showing 8 changed files with 486 additions and 2 deletions.
3 changes: 2 additions & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ module.exports = {
},
"extends": "eslint:recommended",
"parserOptions": {
"sourceType": "module"
"sourceType": "module",
"ecmaVersion": 8
},
"rules": {
"indent": [
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,6 @@ jspm_packages

#mac
.DS_Store

# analyze files
benchmark/
66 changes: 66 additions & 0 deletions analyze/benchmark.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/* eslint-disable no-console */
const { suite, add, cycle, complete, save } = require("benny");
const fs = require("fs");
const rll = require("../src/index.js");
const fileLengths = require("./fileLengths.js");

const files = Object.entries(fileLengths);

const linesToReads = [
50,
100,
500,
1000,
20 * 1000,
];

async function runTest(fileName, fileLength, linesToRead) {
const resultsFileName = `${linesToRead}-${fileLength}`;

await suite(
`Reading ${linesToRead} lines from file with ${fileLength} lines`,

add("RLL", async function() {
return rll.read(fileName, linesToRead);
}),

add("SplitSlice", async function() {
return new Promise((resolve) => {
fs.readFile(fileName, "utf8", (error, file) => {
if(error) {
throw error;
}
resolve(file.split("\n").slice(0 - linesToRead).join("\n"));
});
});
}),

cycle(),
complete(),

save({ file: resultsFileName}),
);

console.log("");

return JSON.parse(fs.readFileSync(`./benchmark/results/${resultsFileName}.json`));
}

async function main() {
const table = {};

for (const [fileName, fileLength] of files) {
const row = {};
for (const linesToRead of linesToReads) {
const results = await runTest(fileName, fileLength, linesToRead);
const winner = results.results.find((test) => test.name === results.slowest.name);
row[linesToRead] = `${results.fastest.name} (${winner.percentSlower}%)`;
}
table[fileLength] = row;
}

console.log("File size X rows read");
console.table(table);
}

main();
49 changes: 49 additions & 0 deletions analyze/createTestFiles.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/* eslint-disable no-console */
const fs = require("fs");
const once = require("events").once;
const cliProgress = require("cli-progress");

const fileLengths = require("./fileLengths.js");
const files = Object.entries(fileLengths);

async function makeTestFile(path, numLines)
{
console.log(`Making test file with length ${numLines}:`);

const file = fs.createWriteStream(path, "utf8");
const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);

progressBar.start(numLines, 0);

for (let index = 0; index < numLines; index++) {
if (index % 1000 === 0) {
progressBar.update(index);
}

let data = index > 0 ? "\n" : "";
data += `${index+1} Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua`;

if (!file.write(data))
{
await once(file, "drain");
}
}

progressBar.update(numLines);
progressBar.stop();
file.end();
console.log();
}

fs.mkdirSync("benchmark/test-files", {
recursive: true,
});


async function main() {
for (const [fileName, fileLength] of files) {
await makeTestFile(fileName, fileLength);
}
}

main();
6 changes: 6 additions & 0 deletions analyze/fileLengths.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = {
"benchmark/test-files/1000.txt": 1000,
"benchmark/test-files/500000.txt": 500000,
"benchmark/test-files/5000000.txt": 5000000,
"benchmark/test-files/8134400.txt": 8134400, // Max file size for stings (~1073741799/132 chars per line)
};
Loading

0 comments on commit abd6728

Please sign in to comment.