mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 04:52:59 +01:00
14b46f90fe
3edc4e34fe2f92e7066c1455f5e42af2fdb43b99 bench: Prevent thread oversubscription (Hennadii Stepanov) ce3e6a7cb21d1aa455513970846e1f70c01472a4 bench: Allow skip benchmark (Hennadii Stepanov) Pull request description: Split out from #18710. Some results (borrowed from #18710): ![89121718-a3329800-d4c1-11ea-8bd1-66da20619696](https://user-images.githubusercontent.com/32963518/90146614-ecb89800-dd89-11ea-80fe-bac0e46e735e.png) ACKs for top commit: fjahr: Code review ACK 3edc4e34fe2f92e7066c1455f5e42af2fdb43b99 Tree-SHA512: df7413ec9ea326564a8e8de54752c9d1444ff7de34edb03e1e0c2120fc333e4640767fdbe3e87eab6a7b389a4863c02e22ad2ae0dbf139fad6a9b85e00f563b4
87 lines
2.7 KiB
C++
87 lines
2.7 KiB
C++
// Copyright (c) 2015-2020 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <bench/bench.h>
|
|
|
|
#include <chainparams.h>
|
|
#include <test/util/setup_common.h>
|
|
#include <validation.h>
|
|
|
|
#include <algorithm>
|
|
#include <assert.h>
|
|
#include <iostream>
|
|
#include <regex>
|
|
|
|
const std::function<void(const std::string&)> G_TEST_LOG_FUN{};
|
|
|
|
namespace {
|
|
|
|
void GenerateTemplateResults(const std::vector<ankerl::nanobench::Result>& benchmarkResults, const std::string& filename, const char* tpl)
|
|
{
|
|
if (benchmarkResults.empty() || filename.empty()) {
|
|
// nothing to write, bail out
|
|
return;
|
|
}
|
|
std::ofstream fout(filename);
|
|
if (fout.is_open()) {
|
|
ankerl::nanobench::render(tpl, benchmarkResults, fout);
|
|
} else {
|
|
std::cout << "Could write to file '" << filename << "'" << std::endl;
|
|
}
|
|
|
|
std::cout << "Created '" << filename << "'" << std::endl;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
benchmark::BenchRunner::BenchmarkMap& benchmark::BenchRunner::benchmarks()
|
|
{
|
|
static std::map<std::string, BenchFunction> benchmarks_map;
|
|
return benchmarks_map;
|
|
}
|
|
|
|
benchmark::BenchRunner::BenchRunner(std::string name, benchmark::BenchFunction func)
|
|
{
|
|
benchmarks().insert(std::make_pair(name, func));
|
|
}
|
|
|
|
void benchmark::BenchRunner::RunAll(const Args& args)
|
|
{
|
|
std::regex reFilter(args.regex_filter);
|
|
std::smatch baseMatch;
|
|
|
|
std::vector<ankerl::nanobench::Result> benchmarkResults;
|
|
for (const auto& p : benchmarks()) {
|
|
if (!std::regex_match(p.first, baseMatch, reFilter)) {
|
|
continue;
|
|
}
|
|
|
|
if (args.is_list_only) {
|
|
std::cout << p.first << std::endl;
|
|
continue;
|
|
}
|
|
|
|
Bench bench;
|
|
bench.name(p.first);
|
|
if (args.asymptote.empty()) {
|
|
p.second(bench);
|
|
} else {
|
|
for (auto n : args.asymptote) {
|
|
bench.complexityN(n);
|
|
p.second(bench);
|
|
}
|
|
std::cout << bench.complexityBigO() << std::endl;
|
|
}
|
|
|
|
if (!bench.results().empty()) {
|
|
benchmarkResults.push_back(bench.results().back());
|
|
}
|
|
}
|
|
|
|
GenerateTemplateResults(benchmarkResults, args.output_csv, "# Benchmark, evals, iterations, total, min, max, median\n"
|
|
"{{#result}}{{name}}, {{epochs}}, {{average(iterations)}}, {{sumProduct(iterations, elapsed)}}, {{minimum(elapsed)}}, {{maximum(elapsed)}}, {{median(elapsed)}}\n"
|
|
"{{/result}}");
|
|
GenerateTemplateResults(benchmarkResults, args.output_json, ankerl::nanobench::templates::json());
|
|
}
|