diff --git a/bench/bench.js b/bench/bench.js new file mode 100644 index 00000000..c7cf8266 --- /dev/null +++ b/bench/bench.js @@ -0,0 +1,13 @@ +'use strict'; + +module.exports = function bench(name) { + var start = process.hrtime(); + return function end(ops) { + var elapsed = process.hrtime(start); + var time = elapsed[0] + elapsed[1] / 1e9; + var rate = ops / time; + + console.log('%s: ops=%d, time=%d, rate=%s', + name, ops, time, rate.toFixed(5)); + }; +}; diff --git a/bench/walletdb.js b/bench/walletdb.js new file mode 100644 index 00000000..a22b4616 --- /dev/null +++ b/bench/walletdb.js @@ -0,0 +1,132 @@ +'use strict'; + +var bn = require('bn.js'); +var bcoin = require('../').set('main'); +var constants = bcoin.protocol.constants; +var network = bcoin.protocol.network; +var utils = bcoin.utils; +var assert = require('assert'); +var scriptTypes = constants.scriptTypes; +var bench = require('./bench'); + +var dummyInput = { + prevout: { + hash: constants.NULL_HASH, + index: 0 + }, + coin: { + version: 1, + height: 0, + value: 50460 * 4, + script: new bcoin.script([]), + coinbase: false, + hash: constants.NULL_HASH, + index: 0 + }, + script: new bcoin.script([]), + witness: new bcoin.witness([]), + sequence: 0xffffffff +}; + +var walletdb = new bcoin.walletdb({ + name: 'wallet-test', + // location: __dirname + '/../walletdb-bench', + // db: 'leveldb' + db: 'memory' +}); +var wallet; +var addrs = []; + +function runBench(callback) { + utils.serial([ + function(next) { + walletdb.create(function(err, w) { + assert.ifError(err); + wallet = w; + next(); + }); + }, + function(next) { + var end = bench('accounts'); + utils.forRange(0, 5000, function(i, next) { + wallet.createAccount({}, function(err, account) { + assert.ifError(err); + addrs.push(account.receiveAddress.getAddress()); + next(); + }); + }, function(err) { + assert.ifError(err); + end(1000); + next(); + }); + }, + function(next) { + var nonce = new bn(0); + var end; + utils.forRange(0, 100000, function(i, next) { + var t1 = bcoin.mtx() + .addOutput(addrs[(i + 0) % addrs.length], 50460) + .addOutput(addrs[(i + 1) % addrs.length], 50460) + .addOutput(addrs[(i + 2) % addrs.length], 50460) + .addOutput(addrs[(i + 3) % addrs.length], 50460); + + t1.addInput(dummyInput); + nonce.addn(1); + t1.inputs[0].script.set(0, nonce); + t1.inputs[0].script.compile(); + + walletdb.addTX(t1.toTX(), function(err) { + assert.ifError(err); + next(); + }); + }, function(err) { + assert.ifError(err); + end(10000); + next(); + }); + end = bench('tx'); + }, + function(next) { + var end = bench('balance'); + wallet.getBalance(function(err, balance) { + assert.ifError(err); + end(1); + next(); + }); + }, + function(next) { + var end = bench('coins'); + wallet.getCoins(function(err) { + assert.ifError(err); + end(1); + next(); + }); + }, + function(next) { + var end = bench('create'); + var options = { + rate: 10000, + outputs: [{ + value: 50460, + address: addrs[0] + }] + }; + wallet.createTX(options, function(err) { + assert.ifError(err); + end(1); + next(); + }); + } + ], function(err) { + assert.ifError(err); + callback(); + }); +} + +walletdb.open(function(err) { + assert.ifError(err); + runBench(function(err) { + assert.ifError(err); + process.exit(0); + }); +});