mirror of
https://github.com/hanzoai/better-sqlite3.git
synced 2026-09-24 16:57:15 +00:00
added new select-all, select-each, and insert benchmarks
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
var dbs = require('./implementations')();
|
||||
var rows = 1000;
|
||||
|
||||
module.exports = function () {
|
||||
exports.buildTables = function () {
|
||||
return createTables([
|
||||
'allSmall (integer INTEGER, real REAL, text TEXT, blob BLOB, nul)',
|
||||
'allLarge (text TEXT, blob BLOB)',
|
||||
@@ -14,12 +14,12 @@ module.exports = function () {
|
||||
'textLarge (text TEXT)',
|
||||
'blobLarge (blob BLOB)'
|
||||
]).then(function () {
|
||||
return fillTable('allSmall', [12345, 0.12345, 'John Peter Smith', Buffer.from('John Peter Smith'), null]);
|
||||
return fillTable('allSmall', getFakeData('small', ['integer', 'real', 'text', 'blob', 'nul']));
|
||||
}).then(function () {
|
||||
var buffer = bufferOf('John Peter Smith', 1024 * 100);
|
||||
return fillTable('allLarge', [buffer.toString(), buffer]);
|
||||
return fillTable('allLarge', getFakeData('large', ['text', 'blob']));
|
||||
});
|
||||
};
|
||||
exports.params = params;
|
||||
|
||||
function createTables(strings) {
|
||||
return strings.reduce(function (promise, SQL) {
|
||||
@@ -46,12 +46,37 @@ function fillTable(table, values) {
|
||||
}).then(function () {return dbs.each('close');});
|
||||
}
|
||||
|
||||
function bufferOf(str, length) {
|
||||
var getFakeData = (function () {
|
||||
var smallData = {
|
||||
integer: 12345,
|
||||
real: 0.12345,
|
||||
text: 'John Peter Smith',
|
||||
blob: Buffer.from('John Peter Smith'),
|
||||
nul: null
|
||||
};
|
||||
var largeData = {
|
||||
text: bufferOf('John Peter Smith', 1024 * 100).toString(),
|
||||
blob: bufferOf('John Peter Smith', 1024 * 100)
|
||||
};
|
||||
function getColumn(column) {
|
||||
if (!this.hasOwnProperty(column)) {
|
||||
var table = this === largeData ? 'large' : 'small';
|
||||
throw new TypeError('No data defined for column "' + table + '.' + column + '".');
|
||||
}
|
||||
return this[column];
|
||||
}
|
||||
return function (size, columns) {
|
||||
var isLarge = size.toLowerCase().indexOf('large') !== -1;
|
||||
return columns.map(getColumn, isLarge ? largeData : smallData);
|
||||
};
|
||||
}());
|
||||
|
||||
function bufferOf(str, size) {
|
||||
var bytesWritten = 0;
|
||||
var source = Buffer.from(String(str));
|
||||
var result = Buffer.allocUnsafe(length >>> 0);
|
||||
while (bytesWritten < length) {
|
||||
bytesWritten += source.copy(result, bytesWritten, 0, Math.min(source.length, length - bytesWritten));
|
||||
var result = Buffer.allocUnsafe(size >>> 0);
|
||||
while (bytesWritten < size) {
|
||||
bytesWritten += source.copy(result, bytesWritten, 0, Math.min(source.length, size - bytesWritten));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -59,3 +84,5 @@ function bufferOf(str, length) {
|
||||
function params(count) {
|
||||
return '(' + new Array(count >>> 0).fill('?').join(', ') + ')';
|
||||
}
|
||||
|
||||
module.exports = Object.assign(getFakeData, exports);
|
||||
+9
-6
@@ -3,7 +3,7 @@ var path = require('path');
|
||||
var fs = require('fs-extra');
|
||||
var clc = require('cli-color');
|
||||
var spawn = require('child_process').spawn;
|
||||
var generateData = require('./generate-data');
|
||||
var factory = require('./factory');
|
||||
process.chdir(path.dirname(__dirname));
|
||||
process.on('SIGINT', exit);
|
||||
process.on('SIGHUP', exit);
|
||||
@@ -21,7 +21,7 @@ var trials;
|
||||
}
|
||||
|
||||
console.log('Generating tables...');
|
||||
generateData().then(function () {
|
||||
factory.buildTables().then(function () {
|
||||
console.log(clc.magenta('--- Benchmarks ---'));
|
||||
nextTrial();
|
||||
}, function (err) {
|
||||
@@ -37,14 +37,17 @@ function getTrials() {
|
||||
var size = trial.table.toLowerCase().indexOf('large') === -1 ? 'small' : 'large';
|
||||
var columns = trial.columns.join(',').toLowerCase();
|
||||
trial.terms = [trial.type.toLowerCase(), size, columns];
|
||||
trial.looseTerms = (trial.pragma || []).filter(customPragma).join('; ').toLowerCase();
|
||||
return trial;
|
||||
}
|
||||
function filterByArgs(trials, arg) {
|
||||
arg = arg.toLowerCase();
|
||||
return trials.filter(function (obj) {return obj.terms.some(matchesThis, arg);});
|
||||
return trials.filter(function (obj) {
|
||||
return obj.terms.indexOf(arg) !== -1 || obj.looseTerms.indexOf(arg) !== -1;
|
||||
});
|
||||
}
|
||||
function matchesThis(str) {
|
||||
return str === String(this);
|
||||
function customPragma(str) {
|
||||
return str.indexOf('cache_size') === -1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +63,7 @@ function nextTrial() {
|
||||
}
|
||||
|
||||
var trial = trials.shift();
|
||||
console.log(clc.cyan(trial.terms.join(' ')));
|
||||
console.log(clc.cyan(trial.terms.join(' ') + (trial.looseTerms && ' | ' + trial.looseTerms)));
|
||||
|
||||
var child = spawn('node', [path.join(__dirname, 'types', trial.type), JSON.stringify(trial)], {stdio: 'inherit'});
|
||||
child.on('exit', function (code) {
|
||||
|
||||
+22
-1
@@ -14,7 +14,28 @@ module.exports = [
|
||||
{type: 'select-all', table: 'allSmall', columns: ['blob']},
|
||||
{type: 'select-all', table: 'allSmall', columns: ['nul']},
|
||||
{type: 'select-all', table: 'allLarge', columns: ['text']},
|
||||
{type: 'select-all', table: 'allLarge', columns: ['blob']}
|
||||
{type: 'select-all', table: 'allLarge', columns: ['blob']},
|
||||
{type: 'select-each', table: 'allSmall', columns: ['integer']},
|
||||
{type: 'select-each', table: 'allSmall', columns: ['real']},
|
||||
{type: 'select-each', table: 'allSmall', columns: ['text']},
|
||||
{type: 'select-each', table: 'allSmall', columns: ['blob']},
|
||||
{type: 'select-each', table: 'allSmall', columns: ['nul']},
|
||||
{type: 'select-each', table: 'allLarge', columns: ['text']},
|
||||
{type: 'select-each', table: 'allLarge', columns: ['blob']},
|
||||
{type: 'insert', table: 'integerSmall', columns: ['integer'], pragma: ['journal_mode = DELETE']},
|
||||
{type: 'insert', table: 'realSmall', columns: ['real'], pragma: ['journal_mode = DELETE']},
|
||||
{type: 'insert', table: 'textSmall', columns: ['text'], pragma: ['journal_mode = DELETE']},
|
||||
{type: 'insert', table: 'blobSmall', columns: ['blob'], pragma: ['journal_mode = DELETE']},
|
||||
{type: 'insert', table: 'nulSmall', columns: ['nul'], pragma: ['journal_mode = DELETE']},
|
||||
{type: 'insert', table: 'textLarge', columns: ['text'], pragma: ['journal_mode = DELETE']},
|
||||
{type: 'insert', table: 'blobLarge', columns: ['blob'], pragma: ['journal_mode = DELETE']},
|
||||
{type: 'insert', table: 'integerSmall', columns: ['integer'], pragma: ['journal_mode = WAL']},
|
||||
{type: 'insert', table: 'realSmall', columns: ['real'], pragma: ['journal_mode = WAL']},
|
||||
{type: 'insert', table: 'textSmall', columns: ['text'], pragma: ['journal_mode = WAL']},
|
||||
{type: 'insert', table: 'blobSmall', columns: ['blob'], pragma: ['journal_mode = WAL']},
|
||||
{type: 'insert', table: 'nulSmall', columns: ['nul'], pragma: ['journal_mode = WAL']},
|
||||
{type: 'insert', table: 'textLarge', columns: ['text'], pragma: ['journal_mode = WAL']},
|
||||
{type: 'insert', table: 'blobLarge', columns: ['blob'], pragma: ['journal_mode = WAL']}
|
||||
];
|
||||
|
||||
if (/^(1|true|on|yes)$/i.test(process.env.NO_CACHE)) {
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
'use strict';
|
||||
// Inserts 1 row
|
||||
require('../runner')(function (benchmark, dbs, ctx) {
|
||||
var factory = require('../factory');
|
||||
var SQL = 'INSERT INTO ' + ctx.table + ' (' + ctx.columns.join(', ') + ') VALUES ' + factory.params(ctx.columns.length);
|
||||
var betterSqlite3 = dbs['better-sqlite3'];
|
||||
var nodeSqlite3 = dbs['node-sqlite3'];
|
||||
var data = factory(ctx.table, ctx.columns);
|
||||
|
||||
benchmark.add('better-sqlite3', function () {
|
||||
betterSqlite3.prepare(SQL).run(data);
|
||||
});
|
||||
benchmark.add('node-sqlite3', function (deferred) {
|
||||
nodeSqlite3.run(SQL, data).then(function () {deferred.resolve();});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
'use strict';
|
||||
// Selects 100 rows
|
||||
require('../runner')(function (benchmark, dbs, ctx) {
|
||||
var SQL = 'SELECT ' + ctx.columns.join(', ') + ' FROM ' + ctx.table + ' WHERE rowid>=? LIMIT 100';
|
||||
var betterSqlite3 = dbs['better-sqlite3'];
|
||||
var nodeSqlite3 = dbs['node-sqlite3'];
|
||||
var rowid = 99;
|
||||
benchmark.on('cycle', function () {rowid = 0;});
|
||||
|
||||
benchmark.add('better-sqlite3', function () {
|
||||
betterSqlite3.prepare(SQL).all(rowid % 1000 - 98);
|
||||
rowid += 100;
|
||||
});
|
||||
benchmark.add('node-sqlite3', function (deferred) {
|
||||
nodeSqlite3.all(SQL, rowid % 1000 - 98).then(function () {deferred.resolve();});
|
||||
rowid += 100;
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
'use strict';
|
||||
// Selects 100 rows
|
||||
require('../runner')(function (benchmark, dbs, ctx) {
|
||||
var SQL = 'SELECT ' + ctx.columns.join(', ') + ' FROM ' + ctx.table + ' WHERE rowid>=? LIMIT 100';
|
||||
var betterSqlite3 = dbs['better-sqlite3'];
|
||||
var nodeSqlite3 = dbs['node-sqlite3'];
|
||||
var rowid = 99;
|
||||
benchmark.on('cycle', function () {rowid = 0;});
|
||||
|
||||
benchmark.add('better-sqlite3', function () {
|
||||
betterSqlite3.prepare(SQL).each(rowid % 1000 - 98, function () {});
|
||||
rowid += 100;
|
||||
});
|
||||
benchmark.add('node-sqlite3', function (deferred) {
|
||||
nodeSqlite3.each(SQL, rowid % 1000 - 98, function () {}).then(function () {deferred.resolve();});
|
||||
rowid += 100;
|
||||
});
|
||||
});
|
||||
@@ -1,4 +1,5 @@
|
||||
'use strict';
|
||||
// Selects 1 row
|
||||
require('../runner')(function (benchmark, dbs, ctx) {
|
||||
var SQL = 'SELECT ' + ctx.columns.join(', ') + ' FROM ' + ctx.table + ' WHERE rowid=?';
|
||||
var betterSqlite3 = dbs['better-sqlite3'];
|
||||
|
||||
Reference in New Issue
Block a user