Problem
wallet_fundrawtransaction.py and wallet_sendall.py are the two slowest functional tests when running without a RAM disk.
# M1 MacBook Pro timings
wallet_fundrawtransaction.py --descriptors | ✓ Passed | 55 s
wallet_fundrawtransaction.py --legacy-wallet | ✓ Passed | 381 s
wallet_sendall.py --descriptors | ✓ Passed | 43 s
wallet_sendall.py --legacy-wallet | ✓ Passed | 327 s
In each case, the majority of the time is spent iterating through 1500 to 1600 getnewaddress() calls. This is particularly slow in the --legacy-wallet runs.
see: https://github.com/bitcoin/bitcoin/blob/master/test/functional/wallet_fundrawtransaction.py#L986-L987 see: https://github.com/bitcoin/bitcoin/blob/master/test/functional/wallet_sendall.py#L324
Solution
Pre-fill the keypool before iterating through those getnewaddress() calls.
With this change, the execution time drops to:
wallet_fundrawtransaction.py --descriptors | ✓ Passed | 52 s # -3s diff
wallet_fundrawtransaction.py --legacy-wallet | ✓ Passed | 291 s # -90s diff
wallet_sendall.py --descriptors | ✓ Passed | 27 s # -16s diff
wallet_sendall.py --legacy-wallet | ✓ Passed | 228 s # -99s diff
Tagging @ Sjors as he had encouraged me to take a look at speeding up the tests.