1 // Copyright (c) 2012-2016 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 #include "wallet/wallet.h"
10 static void addCoin(const CAmount
& nValue
, const CWallet
& wallet
, std::vector
<COutput
>& vCoins
)
14 static int nextLockTime
= 0;
15 CMutableTransaction tx
;
16 tx
.nLockTime
= nextLockTime
++; // so all transactions get different hashes
17 tx
.vout
.resize(nInput
+ 1);
18 tx
.vout
[nInput
].nValue
= nValue
;
19 CWalletTx
* wtx
= new CWalletTx(&wallet
, MakeTransactionRef(std::move(tx
)));
22 COutput
output(wtx
, nInput
, nAge
, true /* spendable */, true /* solvable */, true /* safe */);
23 vCoins
.push_back(output
);
26 // Simple benchmark for wallet coin selection. Note that it maybe be necessary
27 // to build up more complicated scenarios in order to get meaningful
28 // measurements of performance. From laanwj, "Wallet coin selection is probably
29 // the hardest, as you need a wider selection of scenarios, just testing the
30 // same one over and over isn't too useful. Generating random isn't useful
31 // either for measurements."
32 // (https://github.com/bitcoin/bitcoin/issues/7883#issuecomment-224807484)
33 static void CoinSelection(benchmark::State
& state
)
36 std::vector
<COutput
> vCoins
;
37 LOCK(wallet
.cs_wallet
);
39 while (state
.KeepRunning()) {
41 for (COutput output
: vCoins
)
46 for (int i
= 0; i
< 1000; i
++)
47 addCoin(1000 * COIN
, wallet
, vCoins
);
48 addCoin(3 * COIN
, wallet
, vCoins
);
50 std::set
<CInputCoin
> setCoinsRet
;
52 bool success
= wallet
.SelectCoinsMinConf(1003 * COIN
, 1, 6, 0, vCoins
, setCoinsRet
, nValueRet
);
54 assert(nValueRet
== 1003 * COIN
);
55 assert(setCoinsRet
.size() == 2);
59 BENCHMARK(CoinSelection
);