I'm assuming you benchmarked and found that the CPU was spent not in NioClientManager (or nio itself), but in callbacks, such as findDoubleSpendsAgainst?
On October 26, 2016 11:59:01 AM EDT, Justas Dobiliauskas <[email protected]> wrote: >Hey, on a large wallet I have noticed, that *NioClientManager* thread >does >a lot of CPU computation, and meantime other Wallet functions are >unresponsive (possibly because of locking). No need to mention, that >one >thread = once CPU core to do the work. >Is it possible to parallelize this thread work? >One thing I thought would help - compute double spends in parallel. >Quick update and test I did was: updated bitcoinj to support java 8 (as >I'm >not an expert in Java 6 threading), and trying to parallelize >*findDoubleSpendsAgainst >*method. > >private Set<Transaction> findDoubleSpendsAgainst(Transaction tx, >Map<Sha256Hash, Transaction> candidates) { > checkState(lock.isHeldByCurrentThread()); > if (tx.isCoinBase()) return Sets.newHashSet(); > >final Set<TransactionOutPoint> outpoints = >tx.getInputs().stream().map(i -> >i.getOutpoint()).collect(Collectors.toSet()); > > final Set<Transaction> doubleSpendTxns = Sets.newConcurrentHashSet(); > candidates.values().stream().parallel().forEach( > c -> { > c.getInputs().stream() > .filter(i -> outpoints.contains(i.getOutpoint())) > .forEach(o -> doubleSpendTxns.add(c)); > }); > > return doubleSpendTxns; > } > > >Maybe it can be optimized even more, but at this point >*NioClientManager* >thread, together with new *ForkJoinPool* threads, consume all of the >CPU >cores and does their work x(core count) faster! >Still this is only one method I have updated, I think this can be >extended >to use CPU better. >What would be the comments about this approach and implementation on >bitcoinj master for Java 6? > >Thanks, >Justas > >-- >You received this message because you are subscribed to the Google >Groups "bitcoinj" group. >To unsubscribe from this group and stop receiving emails from it, send >an email to [email protected]. >For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "bitcoinj" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
