node-sqlcipher/bench/select.bench.js
2025-09-05 10:00:29 -07:00

85 lines
1.7 KiB
JavaScript

import { bench, describe } from 'vitest';
import BDatabase from '@signalapp/better-sqlite3';
import { DatabaseSync as NDatabase } from 'node:sqlite';
import Database from '../dist/index.mjs';
const PREPARE = `
CREATE TABLE t (
a1 INTEGER,
a2 INTEGER,
a3 INTEGER,
b1 TEXT,
b2 TEXT,
b3 TEXT
);
`;
const INSERT = `
INSERT INTO t (a1, a2, a3, b1, b2, b3) VALUES
($a1, $a2, $a3, $b1, $b2, $b3);
`;
const VALUES = [];
for (let i = 0; i < 100; i += 1) {
VALUES.push({
a1: i,
a2: i ** 2,
a3: i ** 3,
b1: `b1-${i}`,
b2: `b2-${i}`,
b3: `b3-${i}`,
});
}
const SELECT = 'SELECT * FROM t LIMIT 1000';
describe('SELECT * FROM t', () => {
const sdb = new Database(':memory:', { cacheStatements: true });
const bdb = new BDatabase(':memory:');
const ndb = new NDatabase(':memory:');
sdb.exec(PREPARE);
bdb.exec(PREPARE);
ndb.exec(PREPARE);
const sinsert = sdb.prepare(INSERT);
const binsert = bdb.prepare(INSERT);
const ninsert = ndb.prepare(INSERT);
sdb.transaction(() => {
for (const value of VALUES) {
sinsert.run(value);
}
})();
bdb.transaction(() => {
for (const value of VALUES) {
binsert.run(value);
}
})();
ndb.exec('BEGIN');
for (const value of VALUES) {
ninsert.run(value);
}
ndb.exec('COMMIT');
const sselect = sdb.prepare(SELECT);
const bselect = bdb.prepare(SELECT);
bench('@signalapp/sqlcipher', () => {
sselect.all();
});
bench('@signalapp/better-sqlite', () => {
bselect.all();
});
bench('node:sqlite', () => {
// Node.js seems to finalize the statement after `.all()`
const nselect = ndb.prepare(SELECT);
nselect.all();
});
});