added new select-all, select-each, and insert benchmarks

This commit is contained in:
Joshua Wise
2017-04-11 22:24:13 -04:00
parent 8c273e40d7
commit 5cc170ffcd
7 changed files with 119 additions and 15 deletions
@@ -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
View File
@@ -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
View File
@@ -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)) {
+16
View File
@@ -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();});
});
});
+18
View File
@@ -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;
});
});
+18
View File
@@ -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
View File
@@ -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'];