From a2b84c409cbdc3eeb6a01459a03d9f9f595046dc Mon Sep 17 00:00:00 2001 From: Joan Miquel Torres Date: Fri, 6 Jun 2025 00:30:00 +0200 Subject: [PATCH 1/4] Use performance.now() instead of Date.now()... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Wherever applicable (measuring performance, not time). * Failback to support node < 16.0.0 (perf_hook not globally exposed) * Failback to Date.now() for node < 8.5.0 ✔ Tests passed with node > 16.0.0 (22.12.0) ✕ Couldn't pass with node prior 16.0.0 but not due to this changes. https://nodejs.org/docs/latest-v8.x/api/perf_hooks.html#perf_hooks_performance_now https://w3c.github.io/hr-time/ --- packages/pg-native/bench/leaks.js | 13 +++++++++++-- packages/pg-protocol/src/b.ts | 13 +++++++++++-- packages/pg/bench.js | 17 +++++++++++++---- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/packages/pg-native/bench/leaks.js b/packages/pg-native/bench/leaks.js index 72fb8bcef..fc31c3cee 100644 --- a/packages/pg-native/bench/leaks.js +++ b/packages/pg-native/bench/leaks.js @@ -1,6 +1,15 @@ const Client = require('../') const async = require('async') +let performance: { now: () => number }; +try { + // Support for node < 16.0.0 + performance = require('perf_hooks').performance; +} catch (e) { + // failback for node < 8.5.0 + performance = { now: Date.now }; // Fallback to Date.now +} + const loop = function () { const client = new Client() @@ -37,10 +46,10 @@ const loop = function () { const ops = [connect, simpleQuery, paramsQuery, prepared, sync, end] - const start = Date.now() + const start = performance.now() async.series(ops, function (err) { if (err) throw err - console.log(Date.now() - start) + console.log(performance.now() - start) setImmediate(loop) }) } diff --git a/packages/pg-protocol/src/b.ts b/packages/pg-protocol/src/b.ts index 8357623a5..9a415858f 100644 --- a/packages/pg-protocol/src/b.ts +++ b/packages/pg-protocol/src/b.ts @@ -2,16 +2,25 @@ import { BufferReader } from './buffer-reader' +let performance: { now: () => number }; +try { + // Support for node < 16.0.0 + performance = require('perf_hooks').performance; +} catch (e) { + // failback for node < 8.5.0 + performance = { now: Date.now }; // Fallback to Date.now +} + const LOOPS = 1000 let count = 0 -const start = Date.now() +const start = performance.now() const reader = new BufferReader() const buffer = Buffer.from([33, 33, 33, 33, 33, 33, 33, 0]) const run = () => { if (count > LOOPS) { - console.log(Date.now() - start) + console.log(performance.now() - start) return } count++ diff --git a/packages/pg/bench.js b/packages/pg/bench.js index 7aaf7bced..5de137ddf 100644 --- a/packages/pg/bench.js +++ b/packages/pg/bench.js @@ -1,5 +1,14 @@ const pg = require('./lib') +let performance; +try { + // Support for node < 16.0.0 + performance = require('perf_hooks').performance +} catch (e) { + // failback for node < 8.5.0 + performance = { now: () => Date.now() } +}; + const params = { text: 'select typname, typnamespace, typowner, typlen, typbyval, typcategory, typispreferred, typisdefined, typdelim, typrelid, typelem, typarray from pg_type where typtypmod = $1 and typisdefined = $2', values: [-1, true], @@ -23,13 +32,13 @@ const exec = async (client, q) => { } const bench = async (client, q, time) => { - const start = Date.now() + const start = performance.now() let count = 0 // eslint-disable-next-line no-constant-condition while (true) { await exec(client, q) count++ - if (Date.now() - start > time) { + if (performance.now() - start > time) { return count } } @@ -77,9 +86,9 @@ const run = async () => { values: ['test', Buffer.allocUnsafe(104857600)], }) console.log('bytea warmup done') - const start = Date.now() + const start = performance.now() const results = await client.query('SELECT * FROM buf') - const time = Date.now() - start + const time = performance.now() - start console.log('bytea time:', time, 'ms') console.log('bytea length:', results.rows[0].data.byteLength, 'bytes') console.log('on my laptop best so far seen 1407ms and 104857600 bytes') From a11dfd03e839636ee8cc9a6adbe45598aa950735 Mon Sep 17 00:00:00 2001 From: Joan Miquel Torres Date: Fri, 6 Jun 2025 01:33:05 +0200 Subject: [PATCH 2/4] Yarn prettier --- packages/pg-native/bench/leaks.js | 6 +++--- packages/pg-protocol/src/b.ts | 6 +++--- packages/pg/bench.js | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/pg-native/bench/leaks.js b/packages/pg-native/bench/leaks.js index fc31c3cee..4142eea07 100644 --- a/packages/pg-native/bench/leaks.js +++ b/packages/pg-native/bench/leaks.js @@ -1,13 +1,13 @@ const Client = require('../') const async = require('async') -let performance: { now: () => number }; +let performance = { now: () => number } try { // Support for node < 16.0.0 - performance = require('perf_hooks').performance; + performance = require('perf_hooks').performance } catch (e) { // failback for node < 8.5.0 - performance = { now: Date.now }; // Fallback to Date.now + performance = { now: Date.now } // Fallback to Date.now } const loop = function () { diff --git a/packages/pg-protocol/src/b.ts b/packages/pg-protocol/src/b.ts index 9a415858f..f1d98933e 100644 --- a/packages/pg-protocol/src/b.ts +++ b/packages/pg-protocol/src/b.ts @@ -2,13 +2,13 @@ import { BufferReader } from './buffer-reader' -let performance: { now: () => number }; +let performance: { now: () => number } try { // Support for node < 16.0.0 - performance = require('perf_hooks').performance; + performance = require('perf_hooks').performance } catch (e) { // failback for node < 8.5.0 - performance = { now: Date.now }; // Fallback to Date.now + performance = { now: Date.now } // Fallback to Date.now } const LOOPS = 1000 diff --git a/packages/pg/bench.js b/packages/pg/bench.js index 5de137ddf..8531dc650 100644 --- a/packages/pg/bench.js +++ b/packages/pg/bench.js @@ -1,13 +1,13 @@ const pg = require('./lib') -let performance; +let performance try { - // Support for node < 16.0.0 - performance = require('perf_hooks').performance + // Support for node < 16.0.0 + performance = require('perf_hooks').performance } catch (e) { - // failback for node < 8.5.0 - performance = { now: () => Date.now() } -}; + // failback for node < 8.5.0 + performance = { now: () => Date.now() } +} const params = { text: 'select typname, typnamespace, typowner, typlen, typbyval, typcategory, typispreferred, typisdefined, typdelim, typrelid, typelem, typarray from pg_type where typtypmod = $1 and typisdefined = $2', From 65da20e326bb306cd76bee9a87007ae89bef4857 Mon Sep 17 00:00:00 2001 From: Joan Miquel Torres Date: Fri, 6 Jun 2025 01:39:41 +0200 Subject: [PATCH 3/4] More lint fixes. --- packages/pg-native/bench/leaks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pg-native/bench/leaks.js b/packages/pg-native/bench/leaks.js index 4142eea07..ef5dcff3b 100644 --- a/packages/pg-native/bench/leaks.js +++ b/packages/pg-native/bench/leaks.js @@ -1,7 +1,7 @@ const Client = require('../') const async = require('async') -let performance = { now: () => number } +let performance try { // Support for node < 16.0.0 performance = require('perf_hooks').performance From c39ec8b8b9e854a51f1403328950a8a823a512de Mon Sep 17 00:00:00 2001 From: Joan Miquel Torres Date: Thu, 12 Jun 2025 21:55:19 +0200 Subject: [PATCH 4/4] Removed polyfill code for node <16 They are no longer supported: https://github.com/brianc/node-postgres/pull/3483#issuecomment-2967119692 --- packages/pg-native/bench/leaks.js | 9 --------- packages/pg-protocol/src/b.ts | 9 --------- packages/pg/bench.js | 9 --------- 3 files changed, 27 deletions(-) diff --git a/packages/pg-native/bench/leaks.js b/packages/pg-native/bench/leaks.js index ef5dcff3b..ec801af33 100644 --- a/packages/pg-native/bench/leaks.js +++ b/packages/pg-native/bench/leaks.js @@ -1,15 +1,6 @@ const Client = require('../') const async = require('async') -let performance -try { - // Support for node < 16.0.0 - performance = require('perf_hooks').performance -} catch (e) { - // failback for node < 8.5.0 - performance = { now: Date.now } // Fallback to Date.now -} - const loop = function () { const client = new Client() diff --git a/packages/pg-protocol/src/b.ts b/packages/pg-protocol/src/b.ts index f1d98933e..c8a24113d 100644 --- a/packages/pg-protocol/src/b.ts +++ b/packages/pg-protocol/src/b.ts @@ -2,15 +2,6 @@ import { BufferReader } from './buffer-reader' -let performance: { now: () => number } -try { - // Support for node < 16.0.0 - performance = require('perf_hooks').performance -} catch (e) { - // failback for node < 8.5.0 - performance = { now: Date.now } // Fallback to Date.now -} - const LOOPS = 1000 let count = 0 const start = performance.now() diff --git a/packages/pg/bench.js b/packages/pg/bench.js index 8531dc650..57cbe94d8 100644 --- a/packages/pg/bench.js +++ b/packages/pg/bench.js @@ -1,14 +1,5 @@ const pg = require('./lib') -let performance -try { - // Support for node < 16.0.0 - performance = require('perf_hooks').performance -} catch (e) { - // failback for node < 8.5.0 - performance = { now: () => Date.now() } -} - const params = { text: 'select typname, typnamespace, typowner, typlen, typbyval, typcategory, typispreferred, typisdefined, typdelim, typrelid, typelem, typarray from pg_type where typtypmod = $1 and typisdefined = $2', values: [-1, true],