From f4a094a1a37a9b4a35aa2b55fdbf7447c6bce39c Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Fri, 24 Aug 2018 10:28:17 +0100 Subject: [PATCH] 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 8527c20..406fe5d 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) {