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"
8 #include <boost/foreach.hpp>
11 static void addCoin(const CAmount
& nValue
, const CWallet
& wallet
, std::vector
<COutput
>& vCoins
)
15 static int nextLockTime
= 0;
16 CMutableTransaction tx
;
17 tx
.nLockTime
= nextLockTime
++; // so all transactions get different hashes
18 tx
.vout
.resize(nInput
+ 1);
19 tx
.vout
[nInput
].nValue
= nValue
;
20 CWalletTx
* wtx
= new CWalletTx(&wallet
, MakeTransactionRef(std::move(tx
)));
23 COutput
output(wtx
, nInput
, nAge
, true /* spendable */, true /* solvable */, true /* safe */);
24 vCoins
.push_back(output
);
27 // Simple benchmark for wallet coin selection. Note that it maybe be necessary
28 // to build up more complicated scenarios in order to get meaningful
29 // measurements of performance. From laanwj, "Wallet coin selection is probably
30 // the hardest, as you need a wider selection of scenarios, just testing the
31 // same one over and over isn't too useful. Generating random isn't useful
32 // either for measurements."
33 // (https://github.com/bitcoin/bitcoin/issues/7883#issuecomment-224807484)
34 static void CoinSelection(benchmark::State
& state
)
37 std::vector
<COutput
> vCoins
;
38 LOCK(wallet
.cs_wallet
);
40 while (state
.KeepRunning()) {
42 BOOST_FOREACH (COutput output
, vCoins
)
47 for (int i
= 0; i
< 1000; i
++)
48 addCoin(1000 * COIN
, wallet
, vCoins
);
49 addCoin(3 * COIN
, wallet
, vCoins
);
51 std::set
<std::pair
<const CWalletTx
*, unsigned int> > setCoinsRet
;
53 bool success
= wallet
.SelectCoinsMinConf(1003 * COIN
, 1, 6, 0, vCoins
, setCoinsRet
, nValueRet
);
55 assert(nValueRet
== 1003 * COIN
);
56 assert(setCoinsRet
.size() == 2);
60 BENCHMARK(CoinSelection
);