mirror of https://github.com/seald/nedb
parent
2c59251f16
commit
b494958725
@ -0,0 +1,73 @@ |
|||||||
|
/** |
||||||
|
* Functions that are used in several benchmark tests |
||||||
|
*/ |
||||||
|
|
||||||
|
var customUtils = require('../lib/customUtils') |
||||||
|
, fs = require('fs') |
||||||
|
, path = require('path') |
||||||
|
; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Ensure the workspace exists and the db is empty |
||||||
|
*/ |
||||||
|
module.exports.prepareDb = function (filename, cb) { |
||||||
|
customUtils.ensureDirectoryExists(path.dirname(filename), function () { |
||||||
|
fs.exists(filename, function (exists) { |
||||||
|
if (exists) { |
||||||
|
fs.unlink(filename, cb); |
||||||
|
} else { return cb(); } |
||||||
|
}); |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Return an array with the numbers from 0 to n-1, in a random order |
||||||
|
* Useful to get fair tests |
||||||
|
*/ |
||||||
|
module.exports.getRandomArray = function (n) { |
||||||
|
var res, next; |
||||||
|
|
||||||
|
if (n === 0) { return []; } |
||||||
|
if (n === 1) { return [0]; } |
||||||
|
|
||||||
|
res = getRandomArray(n - 1); |
||||||
|
next = Math.floor(Math.random() * n); |
||||||
|
res.splice(next, 0, n - 1); // Add n-1 at a random position in the array
|
||||||
|
|
||||||
|
return res; |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Insert a certain number of documents for testing |
||||||
|
* @param {Datastore} d |
||||||
|
* @param {Number} n |
||||||
|
* @param {Profiler} profiler |
||||||
|
*/ |
||||||
|
module.exports.insertDocs = function (d, n, profiler, cb) { |
||||||
|
var beg = new Date() |
||||||
|
, i = 0; |
||||||
|
|
||||||
|
profiler.step('Begin inserting ' + n + ' docs'); |
||||||
|
|
||||||
|
function insertOne(i) { |
||||||
|
if (i === n) { // Finished
|
||||||
|
console.log("Average time for one insert: " + (profiler.elapsedSinceLastStep() / n) + "ms"); |
||||||
|
profiler.step('Finished inserting ' + n + ' docs'); |
||||||
|
return cb(); |
||||||
|
} |
||||||
|
|
||||||
|
d.insert({ docNumber: i }, function (err) { |
||||||
|
process.nextTick(function () { |
||||||
|
insertOne(i + 1); |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
||||||
|
insertOne(0); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,57 +1,24 @@ |
|||||||
var Datastore = require('../lib/datastore') |
var Datastore = require('../lib/datastore') |
||||||
, benchDb = 'workspace/insert.bench.db' |
, benchDb = 'workspace/insert.bench.db' |
||||||
, fs = require('fs') |
|
||||||
, path = require('path') |
|
||||||
, async = require('async') |
, async = require('async') |
||||||
, customUtils = require('../lib/customUtils') |
, commonUtilities = require('./commonUtilities') |
||||||
|
, execTime = require('exec-time') |
||||||
|
, profiler = new execTime('INSERT BENCH') |
||||||
, n = 10000 |
, n = 10000 |
||||||
, d |
, d = new Datastore(benchDb) |
||||||
; |
; |
||||||
|
|
||||||
if (process.argv[2]) { n = parseInt(process.argv[2], 10); } |
if (process.argv[2]) { n = parseInt(process.argv[2], 10); } |
||||||
|
|
||||||
console.log("Benchmarking insert"); |
|
||||||
|
|
||||||
async.waterfall([ |
async.waterfall([ |
||||||
function (cb) { |
async.apply(commonUtilities.prepareDb, benchDb) |
||||||
console.log("Preparing database"); |
|
||||||
|
|
||||||
customUtils.ensureDirectoryExists(path.dirname(benchDb), function () { |
|
||||||
fs.exists(benchDb, function (exists) { |
|
||||||
if (exists) { |
|
||||||
fs.unlink(benchDb, cb); |
|
||||||
} else { return cb(); } |
|
||||||
}); |
|
||||||
}); |
|
||||||
} |
|
||||||
, function (cb) { |
, function (cb) { |
||||||
d = new Datastore(benchDb); |
|
||||||
d.loadDatabase(cb); |
d.loadDatabase(cb); |
||||||
} |
} |
||||||
, function (cb) { |
, function (cb) { profiler.beginProfiling(); return cb(); } |
||||||
var beg = new Date() |
, async.apply(commonUtilities.insertDocs, d, n, profiler) |
||||||
, i = 0; |
|
||||||
|
|
||||||
console.log("Inserting " + n + " documents"); |
|
||||||
|
|
||||||
function insertOne(i) { |
|
||||||
if (i === n) { // Finished
|
|
||||||
var timeTaken = (new Date()).getTime() - beg.getTime(); // In ms
|
|
||||||
console.log("Time taken: " + (timeTaken / 1000) + "s"); |
|
||||||
console.log("Average time for one insert: " + (timeTaken / n) + "ms"); |
|
||||||
return cb(); |
|
||||||
} |
|
||||||
|
|
||||||
d.insert({ docNumber: i }, function (err) { |
|
||||||
process.nextTick(function () { |
|
||||||
insertOne(i + 1); |
|
||||||
}); |
|
||||||
}); |
|
||||||
} |
|
||||||
insertOne(0); |
|
||||||
} |
|
||||||
], function (err) { |
], function (err) { |
||||||
console.log("Benchmark finished"); |
profiler.step("Benchmark finished"); |
||||||
|
|
||||||
if (err) { return console.log("An error was encountered: ", err); } |
if (err) { return console.log("An error was encountered: ", err); } |
||||||
}); |
}); |
||||||
|
Loading…
Reference in new issue