cb66c5d68e
bazel / bazel.ubuntu-latest (push) Failing after 1s
build-and-test-perfcounters / ubuntu-latest.Debug (push) Failing after 0s
build-and-test-perfcounters / ubuntu-latest.Release (push) Failing after 1s
doxygen / Build HTML documentation (push) Failing after 1s
python + Bazel pre-commit checks / pre-commit (push) Failing after 1s
sanitizer / tsan.Debug (push) Failing after 1s
sanitizer / ubsan.Debug (push) Failing after 0s
sanitizer / ubsan.RelWithDebInfo (push) Failing after 1s
build-and-test-min-cmake / ubuntu-latest.min-cmake (push) Failing after 1s
clang-format-lint / check-clang-format (push) Failing after 1s
sanitizer / asan.Debug (push) Failing after 1s
sanitizer / msan.RelWithDebInfo (push) Failing after 1s
clang-tidy / run-clang-tidy (push) Failing after 1s
sanitizer / msan.Debug (push) Failing after 1s
sanitizer / asan.RelWithDebInfo (push) Failing after 0s
sanitizer / tsan.RelWithDebInfo (push) Failing after 0s
test-bindings / Test Rust bindings on ubuntu-latest (push) Failing after 0s
test-bindings / Test Python 3.10 bindings on ubuntu-latest (push) Failing after 0s
test-bindings / Test Python 3.11 bindings on ubuntu-latest (push) Failing after 0s
test-bindings / Test Python 3.12 bindings on ubuntu-latest (push) Failing after 1s
test-bindings / Test Python 3.13 bindings on ubuntu-latest (push) Failing after 0s
build-and-test / macos-latest.Debug.shared.clang++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Debug.shared.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Debug.shared.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Debug.shared.clang++ (push) Has been cancelled
bazel / bazel.macos-latest (push) Has been cancelled
bazel / bazel.windows-latest (push) Has been cancelled
build-and-test-min-cmake / macos-latest.min-cmake (push) Has been cancelled
build-and-test / ubuntu-22.04.Debug.static.clang++ (push) Has been cancelled
build-and-test / macos-latest.Debug.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Debug.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Debug.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Debug.shared.g++ (push) Has been cancelled
build-and-test / macos-latest.Debug.static.g++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Debug.static.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Debug.static.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Debug.static.g++ (push) Has been cancelled
build-and-test / macos-latest.Release.shared.clang++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Release.shared.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Release.shared.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Release.shared.clang++ (push) Has been cancelled
build-and-test / macos-latest.Release.static.clang++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Release.static.clang++ (push) Has been cancelled
build-and-test / macos-latest.Debug.static.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Debug.static.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Debug.static.clang++ (push) Has been cancelled
build-and-test / macos-latest.Release.static.g++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Release.static.g++ (push) Has been cancelled
build-and-test / windows-2025.Debug.static.VS-18-2025 (push) Has been cancelled
build-and-test / windows-2022.Release.shared.VS-17-2022 (push) Has been cancelled
build-and-test / windows-2022.Release.static.VS-17-2022 (push) Has been cancelled
build-and-test / windows-2025.Release.shared.VS-18-2025 (push) Has been cancelled
build-and-test / windows-2025.Release.static.VS-18-2025 (push) Has been cancelled
build-and-test / windows-latest.Debug.shared.CLANG64 (push) Has been cancelled
build-and-test / windows-latest.Debug.shared.MINGW64 (push) Has been cancelled
build-and-test / windows-latest.Debug.shared.UCRT64 (push) Has been cancelled
build-and-test / windows-latest.Debug.static.CLANG64 (push) Has been cancelled
build-and-test / windows-latest.Debug.static.MINGW64 (push) Has been cancelled
build-and-test / windows-latest.Debug.static.UCRT64 (push) Has been cancelled
build-and-test / ubuntu-24.04.Release.static.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Release.static.clang++ (push) Has been cancelled
build-and-test / macos-latest.Release.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Release.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Release.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Release.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Release.static.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Release.static.g++ (push) Has been cancelled
build-and-test / windows-2022.Debug.shared.VS-17-2022 (push) Has been cancelled
build-and-test / windows-2022.Debug.static.VS-17-2022 (push) Has been cancelled
build-and-test / windows-2025.Debug.shared.VS-18-2025 (push) Has been cancelled
build-and-test / windows-latest.Release.static.MINGW64 (push) Has been cancelled
build-and-test / windows-latest.Release.static.UCRT64 (push) Has been cancelled
test-bindings / Test Python 3.10 bindings on macos-latest (push) Has been cancelled
test-bindings / Test Python 3.11 bindings on macos-latest (push) Has been cancelled
test-bindings / Test Python 3.12 bindings on macos-latest (push) Has been cancelled
test-bindings / Test Python 3.13 bindings on macos-latest (push) Has been cancelled
build-and-test / windows-latest.Release.shared.CLANG64 (push) Has been cancelled
build-and-test / windows-latest.Release.shared.MINGW64 (push) Has been cancelled
build-and-test / windows-latest.Release.shared.UCRT64 (push) Has been cancelled
build-and-test / windows-latest.Release.static.CLANG64 (push) Has been cancelled
test-bindings / Test Python 3.12 bindings on windows-latest (push) Has been cancelled
test-bindings / Test Python 3.13 bindings on windows-latest (push) Has been cancelled
test-bindings / Test Python 3.10 bindings on windows-latest (push) Has been cancelled
test-bindings / Test Python 3.11 bindings on windows-latest (push) Has been cancelled
test-bindings / Test Rust bindings on macos-latest (push) Has been cancelled
test-bindings / Test Rust bindings on windows-latest (push) Has been cancelled
293 lines
9.2 KiB
C++
293 lines
9.2 KiB
C++
// Copyright 2015 Google Inc. All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef BENCHMARK_BENCHMARK_API_H_
|
|
#define BENCHMARK_BENCHMARK_API_H_
|
|
|
|
#if defined(_MSC_VER)
|
|
#pragma warning(push)
|
|
#pragma warning(disable : 4251)
|
|
#endif
|
|
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "benchmark/counter.h"
|
|
#include "benchmark/macros.h"
|
|
#include "benchmark/state.h"
|
|
#include "benchmark/statistics.h"
|
|
#include "benchmark/types.h"
|
|
|
|
namespace benchmark {
|
|
|
|
const char kDefaultMinTimeStr[] = "0.5s";
|
|
|
|
BENCHMARK_EXPORT void MaybeReenterWithoutASLR(int, char**);
|
|
|
|
BENCHMARK_EXPORT std::string GetBenchmarkVersion();
|
|
|
|
BENCHMARK_EXPORT void PrintDefaultHelp();
|
|
|
|
BENCHMARK_EXPORT void Initialize(int* argc, char** argv,
|
|
void (*HelperPrintf)() = PrintDefaultHelp);
|
|
BENCHMARK_EXPORT void Shutdown();
|
|
|
|
BENCHMARK_EXPORT bool ReportUnrecognizedArguments(int argc, char** argv);
|
|
|
|
BENCHMARK_EXPORT std::string GetBenchmarkFilter();
|
|
|
|
BENCHMARK_EXPORT void SetBenchmarkFilter(std::string value);
|
|
|
|
BENCHMARK_EXPORT int32_t GetBenchmarkVerbosity();
|
|
|
|
BENCHMARK_EXPORT BenchmarkReporter* CreateDefaultDisplayReporter();
|
|
|
|
BENCHMARK_EXPORT size_t RunSpecifiedBenchmarks();
|
|
BENCHMARK_EXPORT size_t RunSpecifiedBenchmarks(std::string spec);
|
|
|
|
BENCHMARK_EXPORT size_t
|
|
RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter);
|
|
BENCHMARK_EXPORT size_t
|
|
RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter, std::string spec);
|
|
|
|
BENCHMARK_EXPORT size_t RunSpecifiedBenchmarks(
|
|
BenchmarkReporter* display_reporter, BenchmarkReporter* file_reporter);
|
|
BENCHMARK_EXPORT size_t
|
|
RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter,
|
|
BenchmarkReporter* file_reporter, std::string spec);
|
|
|
|
BENCHMARK_EXPORT TimeUnit GetDefaultTimeUnit();
|
|
|
|
BENCHMARK_EXPORT void SetDefaultTimeUnit(TimeUnit unit);
|
|
|
|
BENCHMARK_EXPORT
|
|
void AddCustomContext(std::string key, std::string value);
|
|
|
|
struct ThreadRunnerBase {
|
|
virtual ~ThreadRunnerBase() {}
|
|
virtual void RunThreads(const std::function<void(int)>& fn) = 0;
|
|
};
|
|
|
|
using threadrunner_factory =
|
|
std::function<std::unique_ptr<ThreadRunnerBase>(int)>;
|
|
|
|
namespace internal {
|
|
class BenchmarkFamilies;
|
|
class BenchmarkInstance;
|
|
} // namespace internal
|
|
|
|
class BENCHMARK_EXPORT Benchmark {
|
|
public:
|
|
virtual ~Benchmark();
|
|
|
|
Benchmark* Name(const std::string& name);
|
|
Benchmark* Arg(int64_t x);
|
|
Benchmark* Unit(TimeUnit unit);
|
|
Benchmark* Range(int64_t start, int64_t limit);
|
|
Benchmark* DenseRange(int64_t start, int64_t limit, int step = 1);
|
|
Benchmark* Args(const std::vector<int64_t>& args);
|
|
Benchmark* ArgPair(int64_t x, int64_t y) {
|
|
std::vector<int64_t> args;
|
|
args.push_back(x);
|
|
args.push_back(y);
|
|
return Args(args);
|
|
}
|
|
Benchmark* Ranges(const std::vector<std::pair<int64_t, int64_t>>& ranges);
|
|
Benchmark* ArgsProduct(const std::vector<std::vector<int64_t>>& arglists);
|
|
Benchmark* ArgName(const std::string& name);
|
|
Benchmark* ArgNames(const std::vector<std::string>& names);
|
|
Benchmark* RangePair(int64_t lo1, int64_t hi1, int64_t lo2, int64_t hi2) {
|
|
std::vector<std::pair<int64_t, int64_t>> ranges;
|
|
ranges.push_back(std::make_pair(lo1, hi1));
|
|
ranges.push_back(std::make_pair(lo2, hi2));
|
|
return Ranges(ranges);
|
|
}
|
|
Benchmark* Setup(callback_function&&);
|
|
Benchmark* Setup(const callback_function&);
|
|
Benchmark* Teardown(callback_function&&);
|
|
Benchmark* Teardown(const callback_function&);
|
|
Benchmark* Apply(const std::function<void(Benchmark* benchmark)>&);
|
|
Benchmark* RangeMultiplier(int multiplier);
|
|
Benchmark* MinTime(double t);
|
|
Benchmark* MinWarmUpTime(double t);
|
|
Benchmark* Iterations(IterationCount n);
|
|
Benchmark* Repetitions(int n);
|
|
Benchmark* ReportAggregatesOnly(bool value = true);
|
|
Benchmark* DisplayAggregatesOnly(bool value = true);
|
|
Benchmark* MeasureProcessCPUTime();
|
|
Benchmark* UseRealTime();
|
|
Benchmark* UseManualTime();
|
|
Benchmark* Complexity(BigO complexity = benchmark::oAuto);
|
|
Benchmark* Complexity(BigOFunc* complexity);
|
|
Benchmark* ComputeStatistics(const std::string& name,
|
|
StatisticsFunc* statistics,
|
|
StatisticUnit unit = kTime);
|
|
Benchmark* Threads(int t);
|
|
Benchmark* ThreadRange(int min_threads, int max_threads);
|
|
Benchmark* DenseThreadRange(int min_threads, int max_threads, int stride = 1);
|
|
Benchmark* ThreadPerCpu();
|
|
Benchmark* ThreadRunner(threadrunner_factory&& factory);
|
|
|
|
virtual void Run(State& state) = 0;
|
|
|
|
TimeUnit GetTimeUnit() const;
|
|
|
|
protected:
|
|
explicit Benchmark(const std::string& name);
|
|
void SetName(const std::string& name);
|
|
|
|
public:
|
|
const char* GetName() const;
|
|
int ArgsCnt() const;
|
|
const char* GetArgName(int arg) const;
|
|
|
|
private:
|
|
friend class internal::BenchmarkFamilies;
|
|
friend class internal::BenchmarkInstance;
|
|
|
|
std::string name_;
|
|
internal::AggregationReportMode aggregation_report_mode_;
|
|
std::vector<std::string> arg_names_;
|
|
std::vector<std::vector<int64_t>> args_;
|
|
|
|
TimeUnit time_unit_;
|
|
bool use_default_time_unit_;
|
|
|
|
int range_multiplier_;
|
|
double min_time_;
|
|
double min_warmup_time_;
|
|
IterationCount iterations_;
|
|
int repetitions_;
|
|
bool measure_process_cpu_time_;
|
|
bool use_real_time_;
|
|
bool use_manual_time_;
|
|
BigO complexity_;
|
|
BigOFunc* complexity_lambda_;
|
|
std::vector<internal::Statistics> statistics_;
|
|
std::vector<int> thread_counts_;
|
|
|
|
callback_function setup_;
|
|
callback_function teardown_;
|
|
|
|
threadrunner_factory threadrunner_;
|
|
|
|
BENCHMARK_DISALLOW_COPY_AND_ASSIGN(Benchmark);
|
|
};
|
|
|
|
namespace internal {
|
|
typedef BENCHMARK_DEPRECATED_MSG(
|
|
"Use ::benchmark::Benchmark instead")::benchmark::Benchmark Benchmark;
|
|
typedef BENCHMARK_DEPRECATED_MSG(
|
|
"Use ::benchmark::threadrunner_factory instead")::benchmark::
|
|
threadrunner_factory threadrunner_factory;
|
|
|
|
typedef void(Function)(State&);
|
|
|
|
BENCHMARK_EXPORT ::benchmark::Benchmark* RegisterBenchmarkInternal(
|
|
std::unique_ptr<::benchmark::Benchmark>);
|
|
BENCHMARK_EXPORT std::map<std::string, std::string>*& GetGlobalContext();
|
|
BENCHMARK_EXPORT void UseCharPointer(char const volatile*);
|
|
BENCHMARK_EXPORT int InitializeStreams();
|
|
BENCHMARK_UNUSED static int stream_init_anchor = InitializeStreams();
|
|
} // namespace internal
|
|
|
|
Benchmark* RegisterBenchmark(const std::string& name, internal::Function* fn);
|
|
|
|
template <class Lambda>
|
|
Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn);
|
|
|
|
BENCHMARK_EXPORT void ClearRegisteredBenchmarks();
|
|
|
|
namespace internal {
|
|
class BENCHMARK_EXPORT FunctionBenchmark : public benchmark::Benchmark {
|
|
public:
|
|
FunctionBenchmark(const std::string& name, Function* func)
|
|
: Benchmark(name), func_(func) {}
|
|
void Run(State& st) override;
|
|
|
|
private:
|
|
Function* func_;
|
|
};
|
|
|
|
template <class Lambda>
|
|
class LambdaBenchmark : public benchmark::Benchmark {
|
|
public:
|
|
void Run(State& st) override { lambda_(st); }
|
|
template <class OLambda>
|
|
LambdaBenchmark(const std::string& name, OLambda&& lam)
|
|
: Benchmark(name), lambda_(std::forward<OLambda>(lam)) {}
|
|
|
|
private:
|
|
LambdaBenchmark(LambdaBenchmark const&) = delete;
|
|
Lambda lambda_;
|
|
};
|
|
} // namespace internal
|
|
|
|
inline Benchmark* RegisterBenchmark(const std::string& name,
|
|
internal::Function* fn) {
|
|
return internal::RegisterBenchmarkInternal(
|
|
::benchmark::internal::make_unique<internal::FunctionBenchmark>(name,
|
|
fn));
|
|
}
|
|
|
|
template <class Lambda>
|
|
Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn) {
|
|
using BenchType =
|
|
internal::LambdaBenchmark<typename std::decay<Lambda>::type>;
|
|
return internal::RegisterBenchmarkInternal(
|
|
::benchmark::internal::make_unique<BenchType>(name,
|
|
std::forward<Lambda>(fn)));
|
|
}
|
|
|
|
template <class Lambda, class... Args>
|
|
Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn,
|
|
Args&&... args) {
|
|
return benchmark::RegisterBenchmark(
|
|
name, [=](benchmark::State& st) { fn(st, args...); });
|
|
}
|
|
|
|
class Fixture : public Benchmark {
|
|
public:
|
|
Fixture() : Benchmark("") {}
|
|
void Run(State& st) override {
|
|
this->SetUp(st);
|
|
this->BenchmarkCase(st);
|
|
this->TearDown(st);
|
|
}
|
|
virtual void SetUp(const State&) {}
|
|
virtual void TearDown(const State&) {}
|
|
virtual void SetUp(State& st) { SetUp(const_cast<const State&>(st)); }
|
|
virtual void TearDown(State& st) { TearDown(const_cast<const State&>(st)); }
|
|
|
|
protected:
|
|
virtual void BenchmarkCase(State&) = 0;
|
|
};
|
|
|
|
BENCHMARK_EXPORT
|
|
std::vector<int64_t> CreateRange(int64_t lo, int64_t hi, int multi);
|
|
|
|
BENCHMARK_EXPORT
|
|
std::vector<int64_t> CreateDenseRange(int64_t start, int64_t limit, int step);
|
|
|
|
} // namespace benchmark
|
|
|
|
#if defined(_MSC_VER)
|
|
#pragma warning(pop)
|
|
#endif
|
|
|
|
#endif // BENCHMARK_BENCHMARK_API_H_
|