Skip to content

Instantly share code, notes, and snippets.

@ErykDarnowski
Last active May 19, 2023 06:13
Show Gist options
  • Save ErykDarnowski/2fa0d64d44f1d5616fa9d0851f60c135 to your computer and use it in GitHub Desktop.
Save ErykDarnowski/2fa0d64d44f1d5616fa9d0851f60c135 to your computer and use it in GitHub Desktop.
Node check files amount vs each file (`access`) vs each file (`readdir`) - benchmark

Node check files amount vs each file (access) vs each file (readdir) - benchmark

image

Usage

  1. Download all files
git clone https://gist.github.com/ErykDarnowski/2fa0d64d44f1d5616fa9d0851f60c135 'Node check files amount vs access vs readdir - benchmark'
  1. Run
npm i

# Create data
mkdir texts
cd texts
xargs touch < ../list.txt
rm ../list.txt

# Run
npm start # once / npm dev # on save
const fs = require("fs");
const path = require("path");
const Benchmark = require("benchmark");
// Vars:
const slugs = ["ballady-i-romanse", "ballady-i-romanse-lilje", "ballady-i-romanse-pani-twardowska", "ballady-i-romanse-powrot-taty", "ballady-i-romanse-rekawiczka", "ballady-i-romanse-romantycznosc", "ballady-i-romanse-rybka", "ballady-i-romanse-switez", "ballady-i-romanse-switezianka", "czaty", "dudarz", "dziady-dziadow-czesci-iii-ustep-do-przyjaciol-moskali", "dziady-dziadow-czesci-iii-ustep-droga-do-rosji", "dziady-dziadow-czesci-iii-ustep-oleszkiewicz", "dziady-dziadow-czesci-iii-ustep-petersburg", "dziady-dziadow-czesci-iii-ustep-pomnik-piotra-wielkiego", "dziady-dziadow-czesci-iii-ustep-przedmiescia-stolicy", "dziady-dziadow-czesci-iii-ustep-przeglad-wojska", "dziady-dziady-poema-dziady-czesc-ii", "dziady-dziady-poema-dziady-czesc-iii", "dziady-dziady-poema-dziady-czesc-iv", "dziady-dziady-poema-upior", "dziady-dziady-widowisko-czesc-i", "farys", "grazyna", "konrad-wallenrod", "ksiegi-narodu-polskiego-i-pielgrzymstwa-polskiego", "liryki-lozanskie-ach-juz-i-w-rodzicielskim-domu", "liryki-lozanskie-bron-mnie-przed-soba", "liryki-lozanskie-do-b-z", "liryki-lozanskie-gdy-tu-moj-trup", "liryki-lozanskie-nad-woda-wielka-i-czysta", "liryki-lozanskie-polaly-sie-lzy", "liryki-lozanskie-pytasz-za-co-bog", "liryki-lozanskie-rece-za-lud-walczace", "liryki-lozanskie-snila-sie-zima", "liryki-lozanskie-snuc-milosc", "liryki-lozanskie-uciec-z-dusza-na-listek", "liryki-lozanskie-widzenie", "liryki-lozanskie-zal-rozrzutnika", "mickevicius-krymo-sonetai-ajudagas", "mickevicius-krymo-sonetai-akermano-tyrai", "mickevicius-krymo-sonetai-alusta-diena", "mickevicius-krymo-sonetai-alusta-nakti", "mickevicius-krymo-sonetai-audra", "mickevicius-krymo-sonetai-bachcisarajus", "mickevicius-krymo-sonetai-bachcisarajus-nakti", "mickevicius-krymo-sonetai-baidarai", "mickevicius-krymo-sonetai-balaklavos-pilies-griuvesiai", "mickevicius-krymo-sonetai-catirdagas", "mickevicius-krymo-sonetai-haremo-kapines", "mickevicius-krymo-sonetai-kalnu-reginys-is-kozlovo-tyru", "mickevicius-krymo-sonetai-keleivis", "mickevicius-krymo-sonetai-kelias-ties-cufut-kales", "mickevicius-krymo-sonetai-kikineiso-kalnas", "mickevicius-krymo-sonetai-mareivyste", "mickevicius-krymo-sonetai-mariu-tyla", "mickevicius-krymo-sonetai-potockaites-karstas", "mickevicius-krymo-sonetai-vanagas", "mickevicius-vaidilos-apysaka", "mickievicius-grazina", "mickievicius-konradas-valenrodas", "mickievicius-nemunui", "mickievicius-ponia-tvardauskiene", "mickievicius-vilija", "mickiewicius-baltas-karzigys", "mickiewicz-bajki-chlop-i-zmija", "mickiewicz-bajki-koza-kozka-i-wilk", "mickiewicz-ballady-i-romanse-do-przyjaciol", "mickiewicz-ballady-i-romanse-kurhanek-maryli", "mickiewicz-ballady-i-romanse-pierwiosnek", "mickiewicz-ballady-i-romanse-to-lubie", "mickiewicz-do-d-d", "mickiewicz-do-joachima-lelewela", "mickiewicz-do-maryi-lempickiej", "mickiewicz-do-maryi-szymanowskiej", "mickiewicz-do-matki-polki", "mickiewicz-do-mojego-cicerone", "mickiewicz-do-na-alpach-w-splugen-1829", "mickiewicz-dudarz", "mickiewicz-kochanek-duchow", "mickiewicz-sen", "mickiewicz-the-tempest", "mickiewicz-to-my-cicerone", "mickiewicz-to-upon-the-alps-in-splugen-1829", "mickiewicz-tukaj", "mickiewicz-uncertainty", "mickiewicz-zaloty", "mickiewicz-zywila", "oda-do-mlodosci", "panicz-i-dziewczyna", "pan-tadeusz", "piesn-filaretow", "popas-w-upicie", "reduta-ordona", "renegat", "smierc-pulkownika", "sonety-krymskie-ajudah", "sonety-krymskie-aluszta-w-dzien", "sonety-krymskie-aluszta-w-nocy", "sonety-krymskie-bajdary", "sonety-krymskie-bakczysaraj", "sonety-krymskie-bakczysaraj-w-nocy", "sonety-krymskie-burza", "sonety-krymskie-cisza-morska", "sonety-krymskie-czatyrdah", "sonety-krymskie-droga-nad-przepascia-w-czufut-kale", "sonety-krymskie-gora-kikineis", "sonety-krymskie-grob-potockiej", "sonety-krymskie-mogily-haremu", "sonety-krymskie-motto-i-dedykacja", "sonety-krymskie-pielgrzym", "sonety-krymskie-ruiny-zamku-w-balaklawie", "sonety-krymskie-stepy-akermanskie", "sonety-krymskie-widok-gor-ze-stepow-kozlowa", "sonety-krymskie-zegluga", "sonety-odeskie-blogoslawienstwo-z-petrarki", "sonety-odeskie-danaidy", "sonety-odeskie-dobranoc", "sonety-odeskie-dobry-wieczor", "sonety-odeskie-do-d-d-elegia", "sonety-odeskie-do-d-d-wizyta", "sonety-odeskie-do-laury", "sonety-odeskie-do-m", "sonety-odeskie-do-marii-p", "sonety-odeskie-do-niemna", "sonety-odeskie-do-patrzysz-mi-w-oczy", "sonety-odeskie-do-wizytujacych", "sonety-odeskie-dzien-dobry", "sonety-odeskie-ekskuza", "sonety-odeskie-luba-ja-wzdycham", "sonety-odeskie-motto", "sonety-odeskie-mowie-z-soba", "sonety-odeskie-niepewnosc", "sonety-odeskie-nieuczona-twa-postac", "sonety-odeskie-pierwszy-raz-jam-niewolnik", "sonety-odeskie-potepi-nas-swietoszek", "sonety-odeskie-pozegnanie-do-d-d", "sonety-odeskie-przypomnienie", "sonety-odeskie-ranek-i-wieczor", "sonety-odeskie-rezygnacja", "sonety-odeskie-strzelec", "sonety-odeskie-widzenie-sie-w-gaju", "sonety-odeskie-w-imionniku-c-s", "sonety-odeskie-xii", "sonety-odeskie-zeglarz", "sonety-odeskie-zima-miejska", "sonety-odeskie-z-petrarki", "trzech-budrysow", "tukaj-albo-proby-przyjazni", "ucieczka"];
let results = [];
let finalResults = [];
const suite = new Benchmark.Suite();
const outputFolder = path.join(__dirname, "texts");
// Funcs:
const reverseStr = (str) => str.split("").reverse().join("");
const decimalMark = (val) => {
let number = 0;
let final = "";
let restOfVal = "";
val = reverseStr(val.toString());
let isDot = val.indexOf(".") != -1;
// Checking if dot is present (split):
if (isDot) {
restOfVal = val.split(".")[0]; // <- odwrotnie bo jest reversed
val = val.split(".")[1]; // <- odwrotnie bo jest reversed
}
// Going thru chars of reversed number as string:
val.split("").map((char) => {
number += 1;
final += char;
// When 3 chars go by add ',' and reset counter:
if (number == 3) {
final += ",";
number = 0;
}
});
// If last is ',' when reversed delete it:
if (final.substr(-1) == ",") final = final.slice(0, -1);
// Reversing back to normal:
final = reverseStr(final);
// Adding stuff after dot:
if (isDot) final += "." + reverseStr(restOfVal);
return final;
};
const checkFileExists = (file) => {
return fs.promises
.access(file, fs.constants.F_OK)
.then(() => true)
.catch(() => false);
};
console.clear();
// Runing tests and displaying the results:
suite
.add("check amount of files", async () => {
// sometimes `fs.readdirSync` is faster, just have to check that
(await fs.promises.readdir(outputFolder)).length === 151;
})
.add("check if each file exists - access", async () => {
const checks = slugs.map((file) =>
checkFileExists(path.join(outputFolder, file + ".txt"))
);
new Set(await Promise.all(checks)).size === 1;
})
.add("check if each file exists - readdir", async () => {
// sometimes `fs.readdirSync`/ other loop types are faster, just have to check that
const files = await fs.promises.readdir(outputFolder);
const missingFiles = slugs.filter((slug) => !files.includes(`${slug}.txt`));
})
.on("cycle", (event) => {
const benchmark = event.target;
console.log("- " + benchmark.toString());
results.push([benchmark.name, Math.round(benchmark.hz)]);
})
.on("complete", (event) => {
const suite = event.currentTarget;
const fastestOption = suite.filter("fastest").map("name");
console.log(`\n@ The fastest option is: '${fastestOption}'\n\n---\n`);
})
.run();
// Sorting results based on hz:
results = results.sort((a, b) => a[1] - b[1]).reverse();
// Removing failed tests:
results = results.filter((x) => x[1] !== 0);
// Adding `%` diff and nicer formatting
for (let i = 0; i < results.length; i++) {
const current = results[i];
const [name, hz] = current;
finalResults.push([
name,
decimalMark(hz) + " ops/s",
parseFloat(((hz * 100) / results[0][1]).toFixed(1)) + "%",
]);
}
console.table(finalResults);
console.log(`\n@ Input size: ${slugs.length}`);
ballady-i-romanse-lilje.txt
ballady-i-romanse-pani-twardowska.txt
ballady-i-romanse-powrot-taty.txt
ballady-i-romanse-rekawiczka.txt
ballady-i-romanse-romantycznosc.txt
ballady-i-romanse-rybka.txt
ballady-i-romanse-switez.txt
ballady-i-romanse-switezianka.txt
ballady-i-romanse.txt
czaty.txt
dudarz.txt
dziady-dziadow-czesci-iii-ustep-do-przyjaciol-moskali.txt
dziady-dziadow-czesci-iii-ustep-droga-do-rosji.txt
dziady-dziadow-czesci-iii-ustep-oleszkiewicz.txt
dziady-dziadow-czesci-iii-ustep-petersburg.txt
dziady-dziadow-czesci-iii-ustep-pomnik-piotra-wielkiego.txt
dziady-dziadow-czesci-iii-ustep-przedmiescia-stolicy.txt
dziady-dziadow-czesci-iii-ustep-przeglad-wojska.txt
dziady-dziady-poema-dziady-czesc-ii.txt
dziady-dziady-poema-dziady-czesc-iii.txt
dziady-dziady-poema-dziady-czesc-iv.txt
dziady-dziady-poema-upior.txt
dziady-dziady-widowisko-czesc-i.txt
farys.txt
grazyna.txt
konrad-wallenrod.txt
ksiegi-narodu-polskiego-i-pielgrzymstwa-polskiego.txt
liryki-lozanskie-ach-juz-i-w-rodzicielskim-domu.txt
liryki-lozanskie-bron-mnie-przed-soba.txt
liryki-lozanskie-do-b-z.txt
liryki-lozanskie-gdy-tu-moj-trup.txt
liryki-lozanskie-nad-woda-wielka-i-czysta.txt
liryki-lozanskie-polaly-sie-lzy.txt
liryki-lozanskie-pytasz-za-co-bog.txt
liryki-lozanskie-rece-za-lud-walczace.txt
liryki-lozanskie-snila-sie-zima.txt
liryki-lozanskie-snuc-milosc.txt
liryki-lozanskie-uciec-z-dusza-na-listek.txt
liryki-lozanskie-widzenie.txt
liryki-lozanskie-zal-rozrzutnika.txt
mickevicius-krymo-sonetai-ajudagas.txt
mickevicius-krymo-sonetai-akermano-tyrai.txt
mickevicius-krymo-sonetai-alusta-diena.txt
mickevicius-krymo-sonetai-alusta-nakti.txt
mickevicius-krymo-sonetai-audra.txt
mickevicius-krymo-sonetai-bachcisarajus-nakti.txt
mickevicius-krymo-sonetai-bachcisarajus.txt
mickevicius-krymo-sonetai-baidarai.txt
mickevicius-krymo-sonetai-balaklavos-pilies-griuvesiai.txt
mickevicius-krymo-sonetai-catirdagas.txt
mickevicius-krymo-sonetai-haremo-kapines.txt
mickevicius-krymo-sonetai-kalnu-reginys-is-kozlovo-tyru.txt
mickevicius-krymo-sonetai-keleivis.txt
mickevicius-krymo-sonetai-kelias-ties-cufut-kales.txt
mickevicius-krymo-sonetai-kikineiso-kalnas.txt
mickevicius-krymo-sonetai-mareivyste.txt
mickevicius-krymo-sonetai-mariu-tyla.txt
mickevicius-krymo-sonetai-potockaites-karstas.txt
mickevicius-krymo-sonetai-vanagas.txt
mickevicius-vaidilos-apysaka.txt
mickievicius-grazina.txt
mickievicius-konradas-valenrodas.txt
mickievicius-nemunui.txt
mickievicius-ponia-tvardauskiene.txt
mickievicius-vilija.txt
mickiewicius-baltas-karzigys.txt
mickiewicz-bajki-chlop-i-zmija.txt
mickiewicz-bajki-koza-kozka-i-wilk.txt
mickiewicz-ballady-i-romanse-do-przyjaciol.txt
mickiewicz-ballady-i-romanse-kurhanek-maryli.txt
mickiewicz-ballady-i-romanse-pierwiosnek.txt
mickiewicz-ballady-i-romanse-to-lubie.txt
mickiewicz-do-d-d.txt
mickiewicz-do-joachima-lelewela.txt
mickiewicz-do-maryi-lempickiej.txt
mickiewicz-do-maryi-szymanowskiej.txt
mickiewicz-do-matki-polki.txt
mickiewicz-do-mojego-cicerone.txt
mickiewicz-do-na-alpach-w-splugen-1829.txt
mickiewicz-dudarz.txt
mickiewicz-kochanek-duchow.txt
mickiewicz-sen.txt
mickiewicz-the-tempest.txt
mickiewicz-to-my-cicerone.txt
mickiewicz-to-upon-the-alps-in-splugen-1829.txt
mickiewicz-tukaj.txt
mickiewicz-uncertainty.txt
mickiewicz-zaloty.txt
mickiewicz-zywila.txt
oda-do-mlodosci.txt
pan-tadeusz.txt
panicz-i-dziewczyna.txt
piesn-filaretow.txt
popas-w-upicie.txt
reduta-ordona.txt
renegat.txt
smierc-pulkownika.txt
sonety-krymskie-ajudah.txt
sonety-krymskie-aluszta-w-dzien.txt
sonety-krymskie-aluszta-w-nocy.txt
sonety-krymskie-bajdary.txt
sonety-krymskie-bakczysaraj-w-nocy.txt
sonety-krymskie-bakczysaraj.txt
sonety-krymskie-burza.txt
sonety-krymskie-cisza-morska.txt
sonety-krymskie-czatyrdah.txt
sonety-krymskie-droga-nad-przepascia-w-czufut-kale.txt
sonety-krymskie-gora-kikineis.txt
sonety-krymskie-grob-potockiej.txt
sonety-krymskie-mogily-haremu.txt
sonety-krymskie-motto-i-dedykacja.txt
sonety-krymskie-pielgrzym.txt
sonety-krymskie-ruiny-zamku-w-balaklawie.txt
sonety-krymskie-stepy-akermanskie.txt
sonety-krymskie-widok-gor-ze-stepow-kozlowa.txt
sonety-krymskie-zegluga.txt
sonety-odeskie-blogoslawienstwo-z-petrarki.txt
sonety-odeskie-danaidy.txt
sonety-odeskie-do-d-d-elegia.txt
sonety-odeskie-do-d-d-wizyta.txt
sonety-odeskie-do-laury.txt
sonety-odeskie-do-m.txt
sonety-odeskie-do-marii-p.txt
sonety-odeskie-do-niemna.txt
sonety-odeskie-do-patrzysz-mi-w-oczy.txt
sonety-odeskie-do-wizytujacych.txt
sonety-odeskie-dobranoc.txt
sonety-odeskie-dobry-wieczor.txt
sonety-odeskie-dzien-dobry.txt
sonety-odeskie-ekskuza.txt
sonety-odeskie-luba-ja-wzdycham.txt
sonety-odeskie-motto.txt
sonety-odeskie-mowie-z-soba.txt
sonety-odeskie-niepewnosc.txt
sonety-odeskie-nieuczona-twa-postac.txt
sonety-odeskie-pierwszy-raz-jam-niewolnik.txt
sonety-odeskie-potepi-nas-swietoszek.txt
sonety-odeskie-pozegnanie-do-d-d.txt
sonety-odeskie-przypomnienie.txt
sonety-odeskie-ranek-i-wieczor.txt
sonety-odeskie-rezygnacja.txt
sonety-odeskie-strzelec.txt
sonety-odeskie-w-imionniku-c-s.txt
sonety-odeskie-widzenie-sie-w-gaju.txt
sonety-odeskie-xii.txt
sonety-odeskie-z-petrarki.txt
sonety-odeskie-zeglarz.txt
sonety-odeskie-zima-miejska.txt
trzech-budrysow.txt
tukaj-albo-proby-przyjazni.txt
ucieczka.txt
{
"name": "benchmark",
"version": "0.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"dev": "nodemon --on-change-only --watch ./index.js"
},
"keywords": [],
"author": "Eryk Darnowski",
"license": "GPL-3.0",
"dependencies": {
"benchmark": "^2.1.4",
"nodemon": "^2.0.22"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment