From e755f6d8aaaffc7700af6a384590853ba090a65d Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Fri, 24 Aug 2018 10:28:17 +0100 Subject: [PATCH 1/2] perf: lazy load format resolvers The require time profile for starting an IPFS daemon (`ipfs daemon`) showed IPLD as a significant contributor to the total time spent requiring modules. This is because the formats are all required ahead of time. In total, the default IPLD formats take around 200ms of time to require. This PR adds support for these default modules lazily. You only suffer the require time when you use a particular format. So if you never use git, ethereum or zcash blocks (probably most people right now) they don't contribute to the startup time of your node. License: MIT Signed-off-by: Alan Shaw --- src/index.js | 124 +++++++++++++++++++++++---------------------------- 1 file changed, 56 insertions(+), 68 deletions(-) diff --git a/src/index.js b/src/index.js index 95b863c..f34fa7e 100644 --- a/src/index.js +++ b/src/index.js @@ -15,20 +15,6 @@ const series = require('async/series') const waterfall = require('async/waterfall') const MemoryStore = require('interface-datastore').MemoryDatastore -const dagPB = require('ipld-dag-pb') -const dagCBOR = require('ipld-dag-cbor') -const ipldGit = require('ipld-git') -const ipldBitcoin = require('ipld-bitcoin') -const ipldEthAccountSnapshot = require('ipld-ethereum').ethAccountSnapshot -const ipldEthBlock = require('ipld-ethereum').ethBlock -const ipldEthBlockList = require('ipld-ethereum').ethBlockList -const ipldEthStateTrie = require('ipld-ethereum').ethStateTrie -const ipldEthStorageTrie = require('ipld-ethereum').ethStorageTrie -const ipldEthTx = require('ipld-ethereum').ethTx -const ipldEthTxTrie = require('ipld-ethereum').ethTxTrie -const ipldRaw = require('ipld-raw') -const ipldZcash = require('ipld-zcash') - function noop () {} class IPLDResolver { @@ -38,7 +24,62 @@ class IPLDResolver { } this.bs = blockService - this.resolvers = {} + + // Support by default dag-pb, dag-cbor, git, and eth-* + this.resolvers = { + get 'dag-pb' () { + const format = require('ipld-dag-pb') + return { resolver: format.resolver, util: format.util } + }, + get 'dag-cbor' () { + const format = require('ipld-dag-cbor') + return { resolver: format.resolver, util: format.util } + }, + get 'git-raw' () { + const format = require('ipld-git') + return { resolver: format.resolver, util: format.util } + }, + get 'bitcoin-block' () { + const format = require('ipld-bitcoin') + return { resolver: format.resolver, util: format.util } + }, + get 'eth-account-snapshot' () { + const format = require('ipld-ethereum').ethAccountSnapshot + return { resolver: format.resolver, util: format.util } + }, + get 'eth-block' () { + const format = require('ipld-ethereum').ethBlock + return { resolver: format.resolver, util: format.util } + }, + get 'eth-block-list' () { + const format = require('ipld-ethereum').ethBlockList + return { resolver: format.resolver, util: format.util } + }, + get 'eth-state-trie' () { + const format = require('ipld-ethereum').ethStateTrie + return { resolver: format.resolver, util: format.util } + }, + get 'eth-storage-trie' () { + const format = require('ipld-ethereum').ethStorageTrie + return { resolver: format.resolver, util: format.util } + }, + get 'eth-tx' () { + const format = require('ipld-ethereum').ethTx + return { resolver: format.resolver, util: format.util } + }, + get 'eth-tx-trie' () { + const format = require('ipld-ethereum').ethTxTrie + return { resolver: format.resolver, util: format.util } + }, + get 'raw' () { + const format = require('ipld-raw') + return { resolver: format.resolver, util: format.util } + }, + get 'zcash-block' () { + const format = require('ipld-zcash') + return { resolver: format.resolver, util: format.util } + } + } this.support = {} @@ -59,59 +100,6 @@ class IPLDResolver { delete this.resolvers[multicodec] } } - - // Support by default dag-pb, dag-cbor, git, and eth-* - this.support.add(dagPB.resolver.multicodec, - dagPB.resolver, - dagPB.util) - - this.support.add(dagCBOR.resolver.multicodec, - dagCBOR.resolver, - dagCBOR.util) - - this.support.add(ipldGit.resolver.multicodec, - ipldGit.resolver, - ipldGit.util) - - this.support.add(ipldBitcoin.resolver.multicodec, - ipldBitcoin.resolver, - ipldBitcoin.util) - - this.support.add(ipldEthAccountSnapshot.resolver.multicodec, - ipldEthAccountSnapshot.resolver, - ipldEthAccountSnapshot.util) - - this.support.add(ipldEthBlock.resolver.multicodec, - ipldEthBlock.resolver, - ipldEthBlock.util) - - this.support.add(ipldEthBlockList.resolver.multicodec, - ipldEthBlockList.resolver, - ipldEthBlockList.util) - - this.support.add(ipldEthStateTrie.resolver.multicodec, - ipldEthStateTrie.resolver, - ipldEthStateTrie.util) - - this.support.add(ipldEthStorageTrie.resolver.multicodec, - ipldEthStorageTrie.resolver, - ipldEthStorageTrie.util) - - this.support.add(ipldEthTx.resolver.multicodec, - ipldEthTx.resolver, - ipldEthTx.util) - - this.support.add(ipldEthTxTrie.resolver.multicodec, - ipldEthTxTrie.resolver, - ipldEthTxTrie.util) - - this.support.add(ipldRaw.resolver.multicodec, - ipldRaw.resolver, - ipldRaw.util) - - this.support.add(ipldZcash.resolver.multicodec, - ipldZcash.resolver, - ipldZcash.util) } get (cid, path, options, callback) { From d6136299d632e3894909357b3474012dde1f9c98 Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Fri, 24 Aug 2018 11:13:38 +0100 Subject: [PATCH 2/2] chore: appease linter License: MIT Signed-off-by: Alan Shaw --- src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index f34fa7e..a3aa69b 100644 --- a/src/index.js +++ b/src/index.js @@ -71,7 +71,7 @@ class IPLDResolver { const format = require('ipld-ethereum').ethTxTrie return { resolver: format.resolver, util: format.util } }, - get 'raw' () { + get raw () { const format = require('ipld-raw') return { resolver: format.resolver, util: format.util } },