From 5de30139aef6d0b6aae4a609d8b80c2a528e407d Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Tue, 16 Feb 2016 01:23:07 -0800 Subject: [PATCH] lru. misc. --- lib/bcoin/blockdb.js | 3 --- lib/bcoin/hd.js | 8 ++++++-- lib/bcoin/lru.js | 40 ++++++++++++++++++++++++++-------------- 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/lib/bcoin/blockdb.js b/lib/bcoin/blockdb.js index 4dde2840..636a5992 100644 --- a/lib/bcoin/blockdb.js +++ b/lib/bcoin/blockdb.js @@ -52,9 +52,6 @@ function BlockDB(options) { compression: true, cacheSize: 16 * 1024 * 1024, writeBufferSize: 8 * 1024 * 1024, - // https://leveldb.googlecode.com/git-history/master/doc/index.html - // Higher block size = better for iterators - // Lower block size = better for gets // blockSize: 4 * 1024, maxOpenFiles: 8192, // blockRestartInterval: 16, diff --git a/lib/bcoin/hd.js b/lib/bcoin/hd.js index 080f616f..6bf3a1fe 100644 --- a/lib/bcoin/hd.js +++ b/lib/bcoin/hd.js @@ -1212,10 +1212,10 @@ function pbkdf2(key, salt, iterations, dkLen) { throw new TypeError('salt must a string or array'); if (typeof key === 'string') - key = utils.toArray(key, null); + key = new Buffer(key, 'ascii'); if (typeof salt === 'string') - salt = utils.toArray(salt, null); + salt = new Buffer(salt, 'ascii'); var DK = new Buffer(dkLen); var U = new Buffer(hLen); @@ -1254,6 +1254,10 @@ function pbkdf2(key, salt, iterations, dkLen) { return DK; } +HD.cache = new bcoin.lru(500, function(key, value) { + return 1; +}); + var cache = { data: {}, count: 0 diff --git a/lib/bcoin/lru.js b/lib/bcoin/lru.js index 5117aece..dd37ec52 100644 --- a/lib/bcoin/lru.js +++ b/lib/bcoin/lru.js @@ -29,7 +29,7 @@ LRU.prototype._getSize = function _getSize(item) { var keySize = item.key.length * 2; if (this.getSize) - return keySize + this.getSize(item.value); + return this.getSize(item.key, item.value); if (item.value == null) return keySize + 1; @@ -56,16 +56,29 @@ LRU.prototype._getSize = function _getSize(item) { }; LRU.prototype._compact = function _compact() { - var item; + var item, next; if (this.size <= this.maxSize) return; - for (item = this.head; item; item = item.next) { - if (this.size < this.maxSize) + for (item = this.head; item; item = next) { + if (this.size <= this.maxSize) break; - this.remove(item.key); + this.size -= this._getSize(item); + delete this.data[item.key]; + next = item.next; + item.prev = null; + item.next = null; } + + if (!item) { + this.head = null; + this.tail = null; + return; + } + + this.head = item; + item.prev = null; }; LRU.prototype.set = function set(key, value) { @@ -201,16 +214,16 @@ var a3 = '3'; var a4 = '4'; var a5 = '5'; var a6 = '6'; -var lru = new LRU(((2 * 4) + 4) * 2); +var lru = new LRU(4, function() { return 1; }); lru.set('a1', a1); assert(lru.get('a1') === '1'); -assert(lru.size === ((2 * 1) + 1) * 2); +assert(lru.size === 1); assert(lru.head.key === 'a1' && lru.tail.key === 'a1' && !lru.head.prev && !lru.head.next); lru._keys(); // console.log(lru._keys()); lru.set('a2', a2); assert(lru.get('a2') === '2'); -assert(lru.size === ((2 * 2) + 2) * 2); +assert(lru.size === 2); assert(lru.head.key === 'a1' && lru.tail.key === 'a2' && !lru.head.prev && lru.head.next.key === 'a2' && !lru.tail.next && lru.tail.prev.key === 'a1'); @@ -218,17 +231,17 @@ lru._keys(); // console.log(lru._keys()); lru.set('a3', a3); assert(lru.get('a3') === '3'); -assert(lru.size === ((2 * 3) + 3) * 2); +assert(lru.size === 3); lru._keys(); // console.log(lru._keys()); lru.set('a3', a3); assert(lru.get('a3') === '3'); -assert(lru.size === ((2 * 3) + 3) * 2); +assert(lru.size === 3); lru._keys(); // console.log(lru._keys()); lru.set('a4', a4); assert(lru.get('a4') === '4'); -assert(lru.size === ((2 * 4) + 4) * 2); +assert(lru.size === 4); lru._keys(); // console.log(lru._keys()); assert(lru.get('a1')); @@ -243,16 +256,15 @@ assert(lru.head.key === 'a2' && lru.tail.key === 'a4' && !lru.tail.next && lru.tail.prev.key === 'a3'); lru.set('a5', a5); assert(lru.get('a5') === '5'); -assert(lru.size === ((2 * 4) + 4) * 2); +assert(lru.size === 4); assert(!lru.get('a1')); lru._keys(); // console.log(lru._keys()); lru.get('a2'); lru._keys(); -// console.log(lru._keys()); lru.set('a6', a6); assert(lru.get('a6') === '6'); -assert(lru.size === ((2 * 4) + 4) * 2); +assert(lru.size === 4); assert(!lru.get('a3')); lru._keys(); // console.log(lru._keys());