From 8964cb342e32fe9de670752539794f4fed3d2fa4 Mon Sep 17 00:00:00 2001 From: luaneko Date: Fri, 10 Jan 2025 19:32:41 +1100 Subject: [PATCH] Update benchmarks --- README.md | 76 ++++++++++++++++++++++++++++++------------------------- mod.ts | 2 +- wire.ts | 8 +++--- 3 files changed, 46 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 63ae3ad..02c3e56 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,12 @@ pglue implements automatic query pipelining which makes it especially performant ## Benchmarks -Performance is generally on par with [postgres.js][1] and up to **4x faster** than [deno-postgres][2]. Keep in mind that database driver benchmarks are largely dependent on the database performance itself and does not necessarily represent accurate real-world performance. +Performance is generally on par with [postgres.js][1] and up to **5x faster** than [deno-postgres][2]. Keep in mind that database driver benchmarks are largely dependent on the database performance itself and does not necessarily represent accurate real-world performance. Tested on a 4 core 2800 MHz x86_64-pc-linux-gnu QEMU VM with Deno 2.1.4 and local PostgreSQL 17.1 installation connected via TCP on localhost: +Test query: `select * from pg_type` + ``` CPU | Common KVM Processor v2.0 Runtime | Deno 2.1.4 (x86_64-unknown-linux-gnu) @@ -18,74 +20,78 @@ benchmark time/iter (avg) iter/s (min … max) p75 --------------- ----------------------------- --------------------- -------------------------- group select n=1 -pglue 9.9 ms 101.1 ( 7.9 ms … 17.8 ms) 10.2 ms 17.8 ms 17.8 ms -postgres.js 8.8 ms 114.2 ( 7.0 ms … 9.5 ms) 9.1 ms 9.5 ms 9.5 ms -deno-postgres 37.4 ms 26.7 ( 25.3 ms … 42.8 ms) 39.2 ms 42.8 ms 42.8 ms +pglue 8.3 ms 120.4 ( 7.2 ms … 14.4 ms) 8.5 ms 14.4 ms 14.4 ms +postgres.js 10.8 ms 92.3 ( 8.1 ms … 26.5 ms) 10.7 ms 26.5 ms 26.5 ms +deno-postgres 37.1 ms 26.9 ( 33.4 ms … 41.3 ms) 38.5 ms 41.3 ms 41.3 ms summary pglue - 1.13x slower than postgres.js - 3.78x faster than deno-postgres + 1.30x faster than postgres.js + 4.47x faster than deno-postgres group select n=5 -pglue 48.2 ms 20.8 ( 41.9 ms … 68.5 ms) 50.3 ms 68.5 ms 68.5 ms -postgres.js 43.6 ms 22.9 ( 38.1 ms … 57.3 ms) 48.6 ms 57.3 ms 57.3 ms -deno-postgres 186.5 ms 5.4 (138.4 ms … 213.2 ms) 193.6 ms 213.2 ms 213.2 ms +pglue 39.9 ms 25.1 ( 37.2 ms … 49.6 ms) 40.8 ms 49.6 ms 49.6 ms +postgres.js 42.4 ms 23.6 ( 36.5 ms … 61.8 ms) 44.2 ms 61.8 ms 61.8 ms +deno-postgres 182.5 ms 5.5 (131.9 ms … 211.8 ms) 193.4 ms 211.8 ms 211.8 ms summary pglue - 1.11x slower than postgres.js - 3.87x faster than deno-postgres + 1.06x faster than postgres.js + 4.57x faster than deno-postgres group select n=10 -pglue 97.8 ms 10.2 ( 90.2 ms … 105.0 ms) 104.0 ms 105.0 ms 105.0 ms -postgres.js 93.8 ms 10.7 ( 80.9 ms … 107.7 ms) 106.1 ms 107.7 ms 107.7 ms -deno-postgres 333.9 ms 3.0 (205.6 ms … 394.9 ms) 377.4 ms 394.9 ms 394.9 ms +pglue 78.9 ms 12.7 ( 72.3 ms … 88.9 ms) 82.5 ms 88.9 ms 88.9 ms +postgres.js 92.0 ms 10.9 ( 77.6 ms … 113.6 ms) 101.2 ms 113.6 ms 113.6 ms +deno-postgres 326.6 ms 3.1 (208.8 ms … 406.0 ms) 388.8 ms 406.0 ms 406.0 ms summary pglue - 1.04x slower than postgres.js - 3.42x faster than deno-postgres + 1.17x faster than postgres.js + 4.14x faster than deno-postgres +``` +Test query: `insert into my_table (a, b, c) values (${a}, ${b}, ${c})` + +``` group insert n=1 -pglue 237.5 µs 4,210 (143.9 µs … 1.3 ms) 249.2 µs 953.3 µs 1.3 ms -postgres.js 242.5 µs 4,124 (137.4 µs … 886.4 µs) 263.4 µs 762.8 µs 865.5 µs -deno-postgres 295.1 µs 3,389 (163.8 µs … 899.3 µs) 340.0 µs 641.7 µs 899.3 µs +pglue 303.3 µs 3,297 (165.6 µs … 2.4 ms) 321.6 µs 1.1 ms 2.4 ms +postgres.js 260.4 µs 3,840 (132.9 µs … 2.7 ms) 276.4 µs 1.1 ms 2.7 ms +deno-postgres 281.6 µs 3,552 (186.1 µs … 1.5 ms) 303.8 µs 613.6 µs 791.8 µs summary pglue - 1.02x faster than postgres.js - 1.24x faster than deno-postgres + 1.17x slower than postgres.js + 1.08x slower than deno-postgres group insert n=10 -pglue 1.1 ms 869.6 (610.1 µs … 2.1 ms) 1.2 ms 2.0 ms 2.1 ms -postgres.js 755.9 µs 1,323 (387.6 µs … 4.7 ms) 805.4 µs 2.8 ms 4.7 ms -deno-postgres 2.3 ms 434.4 ( 1.6 ms … 10.6 ms) 2.4 ms 6.5 ms 10.6 ms +pglue 1.1 ms 878.5 (605.5 µs … 3.2 ms) 1.1 ms 2.2 ms 3.2 ms +postgres.js 849.3 µs 1,177 (529.5 µs … 10.1 ms) 770.6 µs 3.0 ms 10.1 ms +deno-postgres 2.3 ms 439.4 ( 1.4 ms … 4.9 ms) 2.5 ms 4.1 ms 4.9 ms summary pglue - 1.52x slower than postgres.js + 1.34x slower than postgres.js 2.00x faster than deno-postgres group insert n=100 -pglue 9.2 ms 109.0 ( 5.5 ms … 15.6 ms) 10.4 ms 15.6 ms 15.6 ms -postgres.js 14.8 ms 67.4 ( 9.6 ms … 35.8 ms) 16.6 ms 35.8 ms 35.8 ms -deno-postgres 18.8 ms 53.1 ( 14.5 ms … 25.8 ms) 20.9 ms 25.8 ms 25.8 ms +pglue 8.3 ms 121.0 ( 5.0 ms … 13.6 ms) 9.3 ms 13.6 ms 13.6 ms +postgres.js 13.0 ms 76.7 ( 9.0 ms … 26.9 ms) 14.1 ms 26.9 ms 26.9 ms +deno-postgres 19.8 ms 50.5 ( 14.2 ms … 31.8 ms) 22.5 ms 31.8 ms 31.8 ms summary pglue - 1.62x faster than postgres.js - 2.05x faster than deno-postgres + 1.58x faster than postgres.js + 2.40x faster than deno-postgres group insert n=200 -pglue 15.0 ms 66.6 ( 11.1 ms … 19.0 ms) 16.7 ms 19.0 ms 19.0 ms -postgres.js 28.1 ms 35.6 ( 22.8 ms … 40.0 ms) 29.1 ms 40.0 ms 40.0 ms -deno-postgres 35.9 ms 27.9 ( 29.7 ms … 46.5 ms) 37.2 ms 46.5 ms 46.5 ms +pglue 15.1 ms 66.2 ( 9.4 ms … 21.1 ms) 16.8 ms 21.1 ms 21.1 ms +postgres.js 27.8 ms 36.0 ( 22.5 ms … 39.2 ms) 30.2 ms 39.2 ms 39.2 ms +deno-postgres 40.6 ms 24.6 ( 33.5 ms … 51.4 ms) 42.2 ms 51.4 ms 51.4 ms summary pglue - 1.87x faster than postgres.js - 2.39x faster than deno-postgres + 1.84x faster than postgres.js + 2.68x faster than deno-postgres ``` [1]: https://github.com/porsager/postgres diff --git a/mod.ts b/mod.ts index c21392f..eaea793 100644 --- a/mod.ts +++ b/mod.ts @@ -9,7 +9,7 @@ import { unknown, } from "./valita.ts"; import { Pool, wire_connect, type LogLevel } from "./wire.ts"; -import { sql_types, type SqlType, type SqlTypeMap } from "./query.ts"; +import { sql_types, type SqlTypeMap } from "./query.ts"; export { WireError, diff --git a/wire.ts b/wire.ts index ea24504..5587dbb 100644 --- a/wire.ts +++ b/wire.ts @@ -909,8 +909,8 @@ function wire_impl( : ser_decode(RowDescription, msg); return { - ser_params: param_ser(param_desc), - Row: row_ctor(row_desc), + ser_params: make_param_ser(param_desc), + Row: make_row_ctor(row_desc), }; } ); @@ -930,7 +930,7 @@ function wire_impl( (params: unknown[]): (string | null)[]; } - function param_ser({ param_types }: ParameterDescription) { + function make_param_ser({ param_types }: ParameterDescription) { return jit.compiled`function ser_params(xs) { return [ ${jit.map(", ", param_types, (type_oid, i) => { @@ -946,7 +946,7 @@ function wire_impl( new (columns: (BinaryLike | null)[]): Row; } - function row_ctor({ columns }: RowDescription) { + function make_row_ctor({ columns }: RowDescription) { const Row = jit.compiled`function Row(xs) { ${jit.map(" ", columns, ({ name, type_oid }, i) => { const type = types[type_oid] ?? text;