diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 8f29e397f..2c79e04ef 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -77,7 +77,7 @@ case "$1" in zcash_rpc zcbenchmark parameterloading 10 ;; createjoinsplit) - zcash_rpc zcbenchmark createjoinsplit 10 + zcash_rpc zcbenchmark createjoinsplit 10 "${@:3}" ;; verifyjoinsplit) zcash_rpc zcbenchmark verifyjoinsplit 1000 "\"$RAWJOINSPLIT\"" @@ -114,7 +114,7 @@ case "$1" in zcash_rpc zcbenchmark parameterloading 1 ;; createjoinsplit) - zcash_rpc zcbenchmark createjoinsplit 1 + zcash_rpc zcbenchmark createjoinsplit 1 "${@:3}" ;; verifyjoinsplit) zcash_rpc zcbenchmark verifyjoinsplit 1 "\"$RAWJOINSPLIT\"" @@ -149,7 +149,7 @@ case "$1" in zcash_rpc zcbenchmark parameterloading 1 ;; createjoinsplit) - zcash_rpc zcbenchmark createjoinsplit 1 + zcash_rpc zcbenchmark createjoinsplit 1 "${@:3}" ;; verifyjoinsplit) zcash_rpc zcbenchmark verifyjoinsplit 1 "\"$RAWJOINSPLIT\"" diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 7e167bdb4..d00579a3e 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2465,7 +2465,15 @@ Value zc_benchmark(const json_spirit::Array& params, bool fHelp) } else if (benchmarktype == "parameterloading") { sample_times.push_back(benchmark_parameter_loading()); } else if (benchmarktype == "createjoinsplit") { - sample_times.push_back(benchmark_create_joinsplit()); + if (params.size() < 3) { + sample_times.push_back(benchmark_create_joinsplit()); + } else { + int nThreads = params[2].get_int(); + std::vector vals = benchmark_create_joinsplit_threaded(nThreads); + // Divide by nThreads^2 to get average seconds per JoinSplit because + // we are running one JoinSplit per thread. + sample_times.push_back(std::accumulate(vals.begin(), vals.end(), 0.0) / (nThreads*nThreads)); + } } else if (benchmarktype == "verifyjoinsplit") { sample_times.push_back(benchmark_verify_joinsplit(samplejoinsplit)); } else if (benchmarktype == "solveequihash") { diff --git a/src/zcbenchmarks.cpp b/src/zcbenchmarks.cpp index b88ebb9e1..e6f8440ac 100644 --- a/src/zcbenchmarks.cpp +++ b/src/zcbenchmarks.cpp @@ -95,6 +95,27 @@ double benchmark_create_joinsplit() return ret; } +std::vector benchmark_create_joinsplit_threaded(int nThreads) +{ + std::vector ret; + std::vector> tasks; + std::vector threads; + for (int i = 0; i < nThreads; i++) { + std::packaged_task task(&benchmark_create_joinsplit); + tasks.emplace_back(task.get_future()); + threads.emplace_back(std::move(task)); + } + std::future_status status; + for (auto it = tasks.begin(); it != tasks.end(); it++) { + it->wait(); + ret.push_back(it->get()); + } + for (auto it = threads.begin(); it != threads.end(); it++) { + it->join(); + } + return ret; +} + double benchmark_verify_joinsplit(const JSDescription &joinsplit) { struct timeval tv_start; diff --git a/src/zcbenchmarks.h b/src/zcbenchmarks.h index 318921002..b2bc2e373 100644 --- a/src/zcbenchmarks.h +++ b/src/zcbenchmarks.h @@ -7,6 +7,7 @@ extern double benchmark_sleep(); extern double benchmark_parameter_loading(); extern double benchmark_create_joinsplit(); +extern std::vector benchmark_create_joinsplit_threaded(int nThreads); extern double benchmark_solve_equihash(); extern std::vector benchmark_solve_equihash_threaded(int nThreads); extern double benchmark_verify_joinsplit(const JSDescription &joinsplit);