This fixes issues with ComplexMempool
benchmark introduced in #17292 , this stress test benchmarks performance of ancestor and descendant tracking of mempool graph algorithms on a complex Mempool.
This Benchmark first creates 100 base transactions and stores them in available_coins
vector. available_coins
is used for selecting ancestor transactions while creating 800 new transactions. For this a random transaction is picked from available_coins
and some of its outputs are mapped to the inputs of the new transaction being created.
Now in case we exhaust all the outputs of an entry in available_coins
then we need to remove it from available_coins
before the next iteration of choosing a potential ancestor , it is now implemented with this patch.
As the index of the entry is randomly chosen from available_coins
, In order to remove it from the vector , if index of the selected entry is not at the end of available_coins
vector , it is swapped with the entry at the back of the vector , then the entry at the end of available_coins
is popped out.
Earlier the code responsible for constructing outputs of the newly created transaction was inside the loop used for assigning ancestors to the transaction , which does some unnecessary work as it creates outputs of the transaction again and again , now it is moved out of the loop so outputs of the transaction are created just once before adding it to the final list of the transactions created. This one is a minor change to save some computation.
These changes have changed the ComplexMempool
benchmark results on bitcoin:master
as follows :
Before
ns/op | op/s | err% | total | benchmark |
---|---|---|---|---|
232,881,625.00 | 4.29 | 0.7% | 2.55 | ComplexMemPool |
After
ns/op | op/s | err% | total | benchmark |
---|---|---|---|---|
497,275,135.00 | 2.01 | 0.5% | 5.49 | ComplexMemPool |