Implement a simple map + array to reduce memory allocations via Array creation
This commit is contained in:
parent
c91155cc35
commit
79c171292e
@ -209,13 +209,13 @@ BlockService.prototype._detectInitialChainState = function(headers) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var index = this._tip.height - 1;
|
var index = this._tip.height - 1;
|
||||||
var record = Array.from(headers)[index];
|
var record = headers.getIndex(index);
|
||||||
|
|
||||||
if (record[0] !== this._tip.hash) {
|
if (record.hash !== this._tip.hash) {
|
||||||
// reorg! we don't yet have the blocks to reorg to, so we'll rewind the chain back to
|
// reorg! we don't yet have the blocks to reorg to, so we'll rewind the chain back to
|
||||||
// to common ancestor, set the tip to the common ancestor and start the sync
|
// to common ancestor, set the tip to the common ancestor and start the sync
|
||||||
this._chainTips.push(record[0]);
|
this._chainTips.push(record.hash);
|
||||||
this._handleReorg(record[0]);
|
this._handleReorg(record.hash);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -413,7 +413,7 @@ BlockService.prototype._getHash = function(blockArg) {
|
|||||||
var headers = this._header.getAllHeaders();
|
var headers = this._header.getAllHeaders();
|
||||||
|
|
||||||
if (utils.isHeight(blockArg)) {
|
if (utils.isHeight(blockArg)) {
|
||||||
return Array.from(headers)[blockArg];
|
return headers.getIndex(blockArg).hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -439,7 +439,7 @@ BlockService.prototype._getOldBlocks = function(currentHash, commonAncestorHash)
|
|||||||
var oldBlocks;
|
var oldBlocks;
|
||||||
var headers = this._header.getAllHeaders();
|
var headers = this._header.getAllHeaders();
|
||||||
for(var i = headers.length - 1; i > 0; --i) {
|
for(var i = headers.length - 1; i > 0; --i) {
|
||||||
var item = headers[i];
|
var item = headers.getIndex(i);
|
||||||
if (item.hash === currentHash) {
|
if (item.hash === currentHash) {
|
||||||
oldBlocks = [this._blockQueue.get(currentHash)];
|
oldBlocks = [this._blockQueue.get(currentHash)];
|
||||||
continue;
|
continue;
|
||||||
@ -695,7 +695,7 @@ BlockService.prototype._sync = function() {
|
|||||||
log.info('Blocks download progress: ' + this._tip.height + '/' +
|
log.info('Blocks download progress: ' + this._tip.height + '/' +
|
||||||
this._numNeeded + ' (' + (this._tip.height / this._numNeeded*100).toFixed(2) + '%)');
|
this._numNeeded + ' (' + (this._tip.height / this._numNeeded*100).toFixed(2) + '%)');
|
||||||
|
|
||||||
var endHash = Array.from(headers)[ Math.min(this._tip.height + BlockService.MAX_BLOCKS, size) ][0];
|
var endHash = headers.getIndex( Math.min(this._tip.height + BlockService.MAX_BLOCKS, size) ).hash;
|
||||||
|
|
||||||
this._p2p.getBlocks({ startHash: this._tip.hash, endHash: endHash });
|
this._p2p.getBlocks({ startHash: this._tip.hash, endHash: endHash });
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -17,7 +17,7 @@ var HeaderService = function(options) {
|
|||||||
this._tip = null;
|
this._tip = null;
|
||||||
this._p2p = this.node.services.p2p;
|
this._p2p = this.node.services.p2p;
|
||||||
this._db = this.node.services.db;
|
this._db = this.node.services.db;
|
||||||
this._headers = new Map();
|
this._headers = new utils.SimpleMap();
|
||||||
};
|
};
|
||||||
|
|
||||||
inherits(HeaderService, BaseService);
|
inherits(HeaderService, BaseService);
|
||||||
@ -43,8 +43,8 @@ HeaderService.prototype.getAPIMethods = function() {
|
|||||||
HeaderService.prototype.getBlockHeader = function(arg) {
|
HeaderService.prototype.getBlockHeader = function(arg) {
|
||||||
|
|
||||||
if (utils.isHeight(arg)) {
|
if (utils.isHeight(arg)) {
|
||||||
var header = Array.from(this._headers)[arg];
|
var header = this._headers.getIndex(arg);
|
||||||
return header ? header[1] : null;
|
return header ? header : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._headers.get(arg);
|
return this._headers.get(arg);
|
||||||
@ -133,7 +133,7 @@ HeaderService.prototype._onHeaders = function(headers, convert) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var runningHeight = this._tip.height;
|
var runningHeight = this._tip.height;
|
||||||
var prevHeader = Array.from(this._headers)[this._headers.length - 1];
|
var prevHeader = this._headers.getLastIndex();
|
||||||
|
|
||||||
for(var i = 0; i < headers.length; i++) {
|
for(var i = 0; i < headers.length; i++) {
|
||||||
var header = headers[i];
|
var header = headers[i];
|
||||||
|
|||||||
29
lib/utils.js
29
lib/utils.js
@ -199,9 +199,36 @@ utils.encodeTip = function(tip, name) {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
utils.isHeight = function(arg) {
|
utils.isHeight = function(blockArg) {
|
||||||
return _.isNumber(blockArg) || (blockArg.length < 40 && /^[0-9]+$/.test(blockArg))
|
return _.isNumber(blockArg) || (blockArg.length < 40 && /^[0-9]+$/.test(blockArg))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
utils.SimpleMap = function SimpleMap() {
|
||||||
|
var object = {};
|
||||||
|
var array = [];
|
||||||
|
|
||||||
|
this.size = 0;
|
||||||
|
this.length = 0;
|
||||||
|
|
||||||
|
this.get = function (key) {
|
||||||
|
return array[object[key]];
|
||||||
|
};
|
||||||
|
|
||||||
|
this.set = function (key, value) {
|
||||||
|
object[key] = array.length;
|
||||||
|
array.push(value);
|
||||||
|
|
||||||
|
this.size = array.length;
|
||||||
|
this.length = array.length;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getIndex = function (index) {
|
||||||
|
return array[index];
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getLastIndex = function () {
|
||||||
|
return array[array.length - 1];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = utils;
|
module.exports = utils;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user