From 2344dab9b219a9fe746481189156a10279a643f4 Mon Sep 17 00:00:00 2001 From: Yagiz Nizipli Date: Sun, 2 Apr 2023 22:08:04 -0400 Subject: [PATCH 1/2] benchmark: differentiate whatwg and legacy url --- benchmark/url/legacy-url-get-prop.js | 42 +++++++++ benchmark/url/legacy-url-parse.js | 24 +++++ .../url/legacy-vs-whatwg-url-get-prop.js | 90 ------------------- ...url-canParse.js => whatwg-url-canParse.js} | 0 benchmark/url/whatwg-url-get-prop.js | 40 +++++++++ ...hatwg-url-parse.js => whatwg-url-parse.js} | 30 +------ ...path.js => whatwg-url-to-and-from-path.js} | 0 7 files changed, 109 insertions(+), 117 deletions(-) create mode 100644 benchmark/url/legacy-url-get-prop.js create mode 100644 benchmark/url/legacy-url-parse.js delete mode 100644 benchmark/url/legacy-vs-whatwg-url-get-prop.js rename benchmark/url/{whatwgurl-canParse.js => whatwg-url-canParse.js} (100%) create mode 100644 benchmark/url/whatwg-url-get-prop.js rename benchmark/url/{legacy-vs-whatwg-url-parse.js => whatwg-url-parse.js} (53%) rename benchmark/url/{whatwgurl-to-and-from-path.js => whatwg-url-to-and-from-path.js} (100%) diff --git a/benchmark/url/legacy-url-get-prop.js b/benchmark/url/legacy-url-get-prop.js new file mode 100644 index 00000000000000..32c95badb8fac0 --- /dev/null +++ b/benchmark/url/legacy-url-get-prop.js @@ -0,0 +1,42 @@ +'use strict'; +const common = require('../common.js'); +const url = require('url'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + type: common.urlDataTypes, + method: ['legacy', 'whatwg'], + e: [1], +}); + +function main({ type, e }) { + const data = common.bakeUrlData(type, e, false, false).map((i) => url.parse(i)); + const obj = url.parse(data[0]); + const noDead = { + protocol: obj.protocol, + auth: obj.auth, + host: obj.host, + hostname: obj.hostname, + port: obj.port, + pathname: obj.pathname, + search: obj.search, + hash: obj.hash, + }; + const len = data.length; + // It's necessary to assign the values to an object + // to avoid loop invariant code motion. + bench.start(); + for (let i = 0; i < len; i++) { + const obj = data[i]; + noDead.protocol = obj.protocol; + noDead.auth = obj.auth; + noDead.host = obj.host; + noDead.hostname = obj.hostname; + noDead.port = obj.port; + noDead.pathname = obj.pathname; + noDead.search = obj.search; + noDead.hash = obj.hash; + } + bench.end(len); + assert.ok(noDead); +} diff --git a/benchmark/url/legacy-url-parse.js b/benchmark/url/legacy-url-parse.js new file mode 100644 index 00000000000000..504ba79da4a4a0 --- /dev/null +++ b/benchmark/url/legacy-url-parse.js @@ -0,0 +1,24 @@ +'use strict'; +const common = require('../common.js'); +const url = require('url'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + withBase: ['true', 'false'], + type: common.urlDataTypes, + e: [1], + method: ['legacy', 'whatwg'], +}); + +function main({ e, type }) { + const data = common.bakeUrlData(type, e, false, false); + let result = url.parse(data[0]); // Avoid dead code elimination + + bench.start(); + for (let i = 0; i < data.length; ++i) { + result = url.parse(data[i]); + } + bench.end(data.length); + + assert.ok(result); +} diff --git a/benchmark/url/legacy-vs-whatwg-url-get-prop.js b/benchmark/url/legacy-vs-whatwg-url-get-prop.js deleted file mode 100644 index df888f13b98775..00000000000000 --- a/benchmark/url/legacy-vs-whatwg-url-get-prop.js +++ /dev/null @@ -1,90 +0,0 @@ -'use strict'; -const common = require('../common.js'); -const url = require('url'); -const URL = url.URL; -const assert = require('assert'); - -const bench = common.createBenchmark(main, { - type: common.urlDataTypes, - method: ['legacy', 'whatwg'], - e: [1], -}); - -function useLegacy(data) { - const obj = url.parse(data[0]); - const noDead = { - protocol: obj.protocol, - auth: obj.auth, - host: obj.host, - hostname: obj.hostname, - port: obj.port, - pathname: obj.pathname, - search: obj.search, - hash: obj.hash, - }; - const len = data.length; - // It's necessary to assign the values to an object - // to avoid loop invariant code motion. - bench.start(); - for (let i = 0; i < len; i++) { - const obj = data[i]; - noDead.protocol = obj.protocol; - noDead.auth = obj.auth; - noDead.host = obj.host; - noDead.hostname = obj.hostname; - noDead.port = obj.port; - noDead.pathname = obj.pathname; - noDead.search = obj.search; - noDead.hash = obj.hash; - } - bench.end(len); - return noDead; -} - -function useWHATWG(data) { - const obj = new URL(data[0]); - const noDead = { - protocol: obj.protocol, - auth: `${obj.username}:${obj.password}`, - host: obj.host, - hostname: obj.hostname, - port: obj.port, - pathname: obj.pathname, - search: obj.search, - hash: obj.hash, - }; - const len = data.length; - bench.start(); - for (let i = 0; i < len; i++) { - const obj = data[i]; - noDead.protocol = obj.protocol; - noDead.auth = `${obj.username}:${obj.password}`; - noDead.host = obj.host; - noDead.hostname = obj.hostname; - noDead.port = obj.port; - noDead.pathname = obj.pathname; - noDead.search = obj.search; - noDead.hash = obj.hash; - } - bench.end(len); - return noDead; -} - -function main({ type, method, e }) { - let data; - let noDead; // Avoid dead code elimination. - switch (method) { - case 'legacy': - data = common.bakeUrlData(type, e, false, false); - noDead = useLegacy(data.map((i) => url.parse(i))); - break; - case 'whatwg': - data = common.bakeUrlData(type, e, false, true); - noDead = useWHATWG(data); - break; - default: - throw new Error(`Unknown method "${method}"`); - } - - assert.ok(noDead); -} diff --git a/benchmark/url/whatwgurl-canParse.js b/benchmark/url/whatwg-url-canParse.js similarity index 100% rename from benchmark/url/whatwgurl-canParse.js rename to benchmark/url/whatwg-url-canParse.js diff --git a/benchmark/url/whatwg-url-get-prop.js b/benchmark/url/whatwg-url-get-prop.js new file mode 100644 index 00000000000000..3a88dd1da6fae6 --- /dev/null +++ b/benchmark/url/whatwg-url-get-prop.js @@ -0,0 +1,40 @@ +'use strict'; +const common = require('../common.js'); +const url = require('url'); +const URL = url.URL; +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + type: common.urlDataTypes, + e: [1], +}); + +function main({ type, e }) { + const data = common.bakeUrlData(type, e, false, true); + const obj = new URL(data[0]); + const noDead = { + protocol: obj.protocol, + auth: `${obj.username}:${obj.password}`, + host: obj.host, + hostname: obj.hostname, + port: obj.port, + pathname: obj.pathname, + search: obj.search, + hash: obj.hash, + }; + const len = data.length; + bench.start(); + for (let i = 0; i < len; i++) { + const obj = data[i]; + noDead.protocol = obj.protocol; + noDead.auth = `${obj.username}:${obj.password}`; + noDead.host = obj.host; + noDead.hostname = obj.hostname; + noDead.port = obj.port; + noDead.pathname = obj.pathname; + noDead.search = obj.search; + noDead.hash = obj.hash; + } + bench.end(len); + assert.ok(noDead); +} diff --git a/benchmark/url/legacy-vs-whatwg-url-parse.js b/benchmark/url/whatwg-url-parse.js similarity index 53% rename from benchmark/url/legacy-vs-whatwg-url-parse.js rename to benchmark/url/whatwg-url-parse.js index a54d81e15fd6ed..0c10b12587a81c 100644 --- a/benchmark/url/legacy-vs-whatwg-url-parse.js +++ b/benchmark/url/whatwg-url-parse.js @@ -8,20 +8,8 @@ const bench = common.createBenchmark(main, { withBase: ['true', 'false'], type: common.urlDataTypes, e: [1], - method: ['legacy', 'whatwg'], }); -function useLegacy(data) { - const len = data.length; - let result = url.parse(data[0]); // Avoid dead code elimination - bench.start(); - for (let i = 0; i < len; ++i) { - result = url.parse(data[i]); - } - bench.end(len); - return result; -} - function useWHATWGWithBase(data) { const len = data.length; let result = new URL(data[0][0], data[0][1]); // Avoid dead code elimination @@ -45,22 +33,10 @@ function useWHATWGWithoutBase(data) { return result; } -function main({ e, method, type, withBase }) { +function main({ e, type, withBase }) { withBase = withBase === 'true'; - let noDead; // Avoid dead code elimination. - let data; - switch (method) { - case 'legacy': - data = common.bakeUrlData(type, e, false, false); - noDead = useLegacy(data); - break; - case 'whatwg': - data = common.bakeUrlData(type, e, withBase, false); - noDead = withBase ? useWHATWGWithBase(data) : useWHATWGWithoutBase(data); - break; - default: - throw new Error(`Unknown method ${method}`); - } + const data = common.bakeUrlData(type, e, withBase, false); + const noDead = withBase ? useWHATWGWithBase(data) : useWHATWGWithoutBase(data); assert.ok(noDead); } diff --git a/benchmark/url/whatwgurl-to-and-from-path.js b/benchmark/url/whatwg-url-to-and-from-path.js similarity index 100% rename from benchmark/url/whatwgurl-to-and-from-path.js rename to benchmark/url/whatwg-url-to-and-from-path.js From 4124f8297af0d0f5c88531d015ef8a91264870fb Mon Sep 17 00:00:00 2001 From: Yagiz Nizipli Date: Thu, 13 Apr 2023 13:22:09 -0400 Subject: [PATCH 2/2] fixup! benchmark: differentiate whatwg and legacy url --- benchmark/url/legacy-url-get-prop.js | 1 - benchmark/url/legacy-url-parse.js | 2 -- 2 files changed, 3 deletions(-) diff --git a/benchmark/url/legacy-url-get-prop.js b/benchmark/url/legacy-url-get-prop.js index 32c95badb8fac0..09be863e963a25 100644 --- a/benchmark/url/legacy-url-get-prop.js +++ b/benchmark/url/legacy-url-get-prop.js @@ -5,7 +5,6 @@ const assert = require('assert'); const bench = common.createBenchmark(main, { type: common.urlDataTypes, - method: ['legacy', 'whatwg'], e: [1], }); diff --git a/benchmark/url/legacy-url-parse.js b/benchmark/url/legacy-url-parse.js index 504ba79da4a4a0..ac893ebf8ad12e 100644 --- a/benchmark/url/legacy-url-parse.js +++ b/benchmark/url/legacy-url-parse.js @@ -4,10 +4,8 @@ const url = require('url'); const assert = require('assert'); const bench = common.createBenchmark(main, { - withBase: ['true', 'false'], type: common.urlDataTypes, e: [1], - method: ['legacy', 'whatwg'], }); function main({ e, type }) {