From 09849105fe80747be7d124983bbaad31023cc2ed Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Tue, 17 Sep 2024 20:30:39 -0400 Subject: [PATCH] benchmark: add dotenv benchmark MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/54278 Reviewed-By: James M Snell Reviewed-By: Vinícius Lourenço Claro Cardoso Reviewed-By: Yagiz Nizipli --- benchmark/fixtures/valid.env | 67 ++++++++++++++++++++++++++++++++++++ benchmark/util/parse-env.js | 23 +++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 benchmark/fixtures/valid.env create mode 100644 benchmark/util/parse-env.js diff --git a/benchmark/fixtures/valid.env b/benchmark/fixtures/valid.env new file mode 100644 index 00000000000000..120488d57917e0 --- /dev/null +++ b/benchmark/fixtures/valid.env @@ -0,0 +1,67 @@ +BASIC=basic + +# COMMENTS=work +#BASIC=basic2 +#BASIC=basic3 + +# previous line intentionally left blank +AFTER_LINE=after_line +EMPTY= +EMPTY_SINGLE_QUOTES='' +EMPTY_DOUBLE_QUOTES="" +EMPTY_BACKTICKS=`` +SINGLE_QUOTES='single_quotes' +SINGLE_QUOTES_SPACED=' single quotes ' +DOUBLE_QUOTES="double_quotes" +DOUBLE_QUOTES_SPACED=" double quotes " +DOUBLE_QUOTES_INSIDE_SINGLE='double "quotes" work inside single quotes' +DOUBLE_QUOTES_WITH_NO_SPACE_BRACKET="{ port: $MONGOLAB_PORT}" +SINGLE_QUOTES_INSIDE_DOUBLE="single 'quotes' work inside double quotes" +BACKTICKS_INSIDE_SINGLE='`backticks` work inside single quotes' +BACKTICKS_INSIDE_DOUBLE="`backticks` work inside double quotes" +BACKTICKS=`backticks` +BACKTICKS_SPACED=` backticks ` +DOUBLE_QUOTES_INSIDE_BACKTICKS=`double "quotes" work inside backticks` +SINGLE_QUOTES_INSIDE_BACKTICKS=`single 'quotes' work inside backticks` +DOUBLE_AND_SINGLE_QUOTES_INSIDE_BACKTICKS=`double "quotes" and single 'quotes' work inside backticks` +EXPAND_NEWLINES="expand\nnew\nlines" +DONT_EXPAND_UNQUOTED=dontexpand\nnewlines +DONT_EXPAND_SQUOTED='dontexpand\nnewlines' +# COMMENTS=work +INLINE_COMMENTS=inline comments # work #very #well +INLINE_COMMENTS_SINGLE_QUOTES='inline comments outside of #singlequotes' # work +INLINE_COMMENTS_DOUBLE_QUOTES="inline comments outside of #doublequotes" # work +INLINE_COMMENTS_BACKTICKS=`inline comments outside of #backticks` # work +INLINE_COMMENTS_SPACE=inline comments start with a#number sign. no space required. +EQUAL_SIGNS=equals== +RETAIN_INNER_QUOTES={"foo": "bar"} +RETAIN_INNER_QUOTES_AS_STRING='{"foo": "bar"}' +RETAIN_INNER_QUOTES_AS_BACKTICKS=`{"foo": "bar's"}` +TRIM_SPACE_FROM_UNQUOTED= some spaced out string +SPACE_BEFORE_DOUBLE_QUOTES= "space before double quotes" +EMAIL=therealnerdybeast@example.tld + SPACED_KEY = parsed +EDGE_CASE_INLINE_COMMENTS="VALUE1" # or "VALUE2" or "VALUE3" + +MULTI_DOUBLE_QUOTED="THIS +IS +A +MULTILINE +STRING" + +MULTI_SINGLE_QUOTED='THIS +IS +A +MULTILINE +STRING' + +MULTI_BACKTICKED=`THIS +IS +A +"MULTILINE'S" +STRING` +export EXPORT_EXAMPLE = ignore export + +MULTI_NOT_VALID_QUOTE=" +MULTI_NOT_VALID=THIS +IS NOT MULTILINE diff --git a/benchmark/util/parse-env.js b/benchmark/util/parse-env.js new file mode 100644 index 00000000000000..1bcd08ba213b93 --- /dev/null +++ b/benchmark/util/parse-env.js @@ -0,0 +1,23 @@ +'use strict'; + +const { createBenchmark } = require('../common.js'); +const path = require('node:path'); +const fs = require('node:fs'); +const util = require('node:util'); +const assert = require('node:assert'); + +const bench = createBenchmark(main, { + n: 3e4, +}); + +const env = fs.readFileSync(path.resolve(__dirname, '../fixtures/valid.env'), 'utf-8'); + +function main({ n }) { + let noDead; + bench.start(); + for (let i = 0; i < n; i++) { + noDead = util.parseEnv(env); + } + bench.end(n); + assert(noDead !== undefined); +}