diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index e28ed01a..d2f32ea7 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -77,10 +77,15 @@ case "$1" in zcash_rpc zcbenchmark createjoinsplit 10 ;; verifyjoinsplit) - zcash_rpc zcbenchmark verifyjoinsplit 1000 "$RAWJOINSPLIT" + zcash_rpc zcbenchmark verifyjoinsplit 1000 "\"$RAWJOINSPLIT\"" ;; solveequihash) - zcash_rpc zcbenchmark solveequihash 10 + if [ "$#" -ge "3" ] + then + zcash_rpc zcbenchmark solveequihash 10 "$3" + else + zcash_rpc zcbenchmark solveequihash 10 + fi ;; verifyequihash) zcash_rpc zcbenchmark verifyequihash 1000 @@ -108,10 +113,15 @@ case "$1" in zcash_rpc zcbenchmark createjoinsplit 1 ;; verifyjoinsplit) - zcash_rpc zcbenchmark verifyjoinsplit 1 "$RAWJOINSPLIT" + zcash_rpc zcbenchmark verifyjoinsplit 1 "\"$RAWJOINSPLIT\"" ;; solveequihash) - zcash_rpc zcbenchmark solveequihash 1 + if [ "$#" -ge "3" ] + then + zcash_rpc zcbenchmark solveequihash 1 "$3" + else + zcash_rpc zcbenchmark solveequihash 1 + fi ;; verifyequihash) zcash_rpc zcbenchmark verifyequihash 1 @@ -137,10 +147,15 @@ case "$1" in zcash_rpc zcbenchmark createjoinsplit 1 ;; verifyjoinsplit) - zcash_rpc zcbenchmark verifyjoinsplit 1 "$RAWJOINSPLIT" + zcash_rpc zcbenchmark verifyjoinsplit 1 "\"$RAWJOINSPLIT\"" ;; solveequihash) - zcash_rpc zcbenchmark solveequihash 1 + if [ "$#" -ge "3" ] + then + zcash_rpc zcbenchmark solveequihash 1 "$3" + else + zcash_rpc zcbenchmark solveequihash 1 + fi ;; verifyequihash) zcash_rpc zcbenchmark verifyequihash 1 diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 0e2ba52e..7efb7d74 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -96,6 +96,7 @@ static const CRPCConvertParam vRPCConvertParams[] = { "zcrawjoinsplit", 3 }, { "zcrawjoinsplit", 4 }, { "zcbenchmark", 1 }, + { "zcbenchmark", 2 }, { "getblocksubsidy", 0} }; diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 77ec55a3..0f72141f 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2438,7 +2438,12 @@ Value zc_benchmark(const json_spirit::Array& params, bool fHelp) } else if (benchmarktype == "verifyjoinsplit") { sample_times.push_back(benchmark_verify_joinsplit(samplejoinsplit)); } else if (benchmarktype == "solveequihash") { - sample_times.push_back(benchmark_solve_equihash()); + if (params.size() < 3) { + sample_times.push_back(benchmark_solve_equihash(true)); + } else { + int nThreads = params[2].get_int(); + sample_times.push_back(benchmark_solve_equihash_threaded(nThreads)); + } } else if (benchmarktype == "verifyequihash") { sample_times.push_back(benchmark_verify_equihash()); } else if (benchmarktype == "validatelargetx") { diff --git a/src/zcbenchmarks.cpp b/src/zcbenchmarks.cpp index 98bf7e04..004f9d0c 100644 --- a/src/zcbenchmarks.cpp +++ b/src/zcbenchmarks.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "coins.h" #include "util.h" #include "init.h" @@ -97,7 +98,7 @@ double benchmark_verify_joinsplit(const JSDescription &joinsplit) return timer_stop(); } -double benchmark_solve_equihash() +double benchmark_solve_equihash(bool time) { CBlock pblock; CEquihashInput I{pblock}; @@ -116,10 +117,24 @@ double benchmark_solve_equihash() nonce.begin(), nonce.size()); - timer_start(); + if (time) + timer_start(); std::set> solns; EhOptimisedSolveUncancellable(n, k, eh_state, [](std::vector soln) { return false; }); + if (time) + return timer_stop(); + else + return 0; +} + +double benchmark_solve_equihash_threaded(int nThreads) +{ + boost::thread_group solverThreads; + timer_start(); + for (int i = 0; i < nThreads; i++) + solverThreads.create_thread(boost::bind(&benchmark_solve_equihash, false)); + solverThreads.join_all(); return timer_stop(); } diff --git a/src/zcbenchmarks.h b/src/zcbenchmarks.h index 906cadcc..c11f0c9f 100644 --- a/src/zcbenchmarks.h +++ b/src/zcbenchmarks.h @@ -7,7 +7,8 @@ extern double benchmark_sleep(); extern double benchmark_parameter_loading(); extern double benchmark_create_joinsplit(); -extern double benchmark_solve_equihash(); +extern double benchmark_solve_equihash(bool time); +extern double benchmark_solve_equihash_threaded(int nThreads); extern double benchmark_verify_joinsplit(const JSDescription &joinsplit); extern double benchmark_verify_equihash(); extern double benchmark_large_tx();