7 #include "pybind11/operators.h"
8 #include "pybind11/pybind11.h"
9 #include "pybind11/stl.h"
10 #include "pybind11/stl_bind.h"
12 #include "benchmark/benchmark.h"
17 namespace py = ::pybind11;
19 std::vector<std::string>
Initialize(
const std::vector<std::string>& argv) {
24 std::vector<char*> ptrs;
25 ptrs.reserve(argv.size());
26 for (
auto&
arg : argv) {
27 ptrs.push_back(
const_cast<char*
>(
arg.c_str()));
29 ptrs[0] =
const_cast<char*
>(executable_name.c_str());
30 int argc =
static_cast<int>(argv.size());
32 std::vector<std::string> remaining_argv;
33 remaining_argv.reserve(argc);
34 for (
int i = 0;
i < argc; ++
i) {
35 remaining_argv.emplace_back(ptrs[
i]);
37 return remaining_argv;
46 PYBIND11_MODULE(_benchmark,
m) {
48 py::enum_<TimeUnit>(
m,
"TimeUnit")
56 py::enum_<BigO>(
m,
"BigO")
69 py::class_<Benchmark>(
m,
"Benchmark")
78 .def(
"unit", &Benchmark::Unit, py::return_value_policy::reference)
84 py::return_value_policy::reference,
py::arg(
"start"),
86 .def(
"ranges", &Benchmark::Ranges, py::return_value_policy::reference)
87 .def(
"args_product", &Benchmark::ArgsProduct,
88 py::return_value_policy::reference)
89 .def(
"arg_name", &Benchmark::ArgName, py::return_value_policy::reference)
91 py::return_value_policy::reference)
93 py::return_value_policy::reference,
py::arg(
"lo1"),
py::arg(
"hi1"),
96 py::return_value_policy::reference)
97 .def(
"min_time", &Benchmark::MinTime, py::return_value_policy::reference)
99 py::return_value_policy::reference)
101 py::return_value_policy::reference)
102 .def(
"report_aggregates_only", &Benchmark::ReportAggregatesOnly,
103 py::return_value_policy::reference,
py::arg(
"value") =
true)
104 .def(
"display_aggregates_only", &Benchmark::DisplayAggregatesOnly,
105 py::return_value_policy::reference,
py::arg(
"value") =
true)
106 .def(
"measure_process_cpu_time", &Benchmark::MeasureProcessCPUTime,
107 py::return_value_policy::reference)
108 .def(
"use_real_time", &Benchmark::UseRealTime,
109 py::return_value_policy::reference)
110 .def(
"use_manual_time", &Benchmark::UseManualTime,
111 py::return_value_policy::reference)
115 py::return_value_policy::reference,
119 py::class_<Counter> py_counter(
m,
"Counter");
121 py::enum_<Counter::Flags>(py_counter,
"Flags")
122 .value(
"kDefaults", Counter::Flags::kDefaults)
123 .value(
"kIsRate", Counter::Flags::kIsRate)
124 .value(
"kAvgThreads", Counter::Flags::kAvgThreads)
125 .value(
"kAvgThreadsRate", Counter::Flags::kAvgThreadsRate)
126 .value(
"kIsIterationInvariant", Counter::Flags::kIsIterationInvariant)
127 .value(
"kIsIterationInvariantRate",
128 Counter::Flags::kIsIterationInvariantRate)
129 .value(
"kAvgIterations", Counter::Flags::kAvgIterations)
130 .value(
"kAvgIterationsRate", Counter::Flags::kAvgIterationsRate)
131 .value(
"kInvert", Counter::Flags::kInvert)
135 py::enum_<Counter::OneK>(py_counter,
"OneK")
136 .value(
"kIs1000", Counter::OneK::kIs1000)
137 .value(
"kIs1024", Counter::OneK::kIs1024)
141 .def(py::init<double, Counter::Flags, Counter::OneK>(),
143 py::arg(
"k") = Counter::kIs1000)
147 .def_readwrite(
"oneK", &Counter::oneK);
148 py::implicitly_convertible<py::float_, Counter>();
149 py::implicitly_convertible<py::int_, Counter>();
151 py::bind_map<benchmark::UserCounters>(
m,
"UserCounters");
154 py::class_<State>(
m,
"State")
155 .def(
"__bool__", &State::KeepRunning)
156 .def_property_readonly(
"keep_running", &State::KeepRunning)
157 .def(
"pause_timing", &State::PauseTiming)
158 .def(
"resume_timing", &State::ResumeTiming)
159 .def(
"skip_with_error", &State::SkipWithError)
160 .def_property_readonly(
"error_occurred", &State::error_occurred)
161 .def(
"set_iteration_time", &State::SetIterationTime)
162 .def_property(
"bytes_processed", &State::bytes_processed,
163 &State::SetBytesProcessed)
164 .def_property(
"complexity_n", &State::complexity_length_n,
165 &State::SetComplexityN)
166 .def_property(
"items_processed", &State::items_processed,
167 &State::SetItemsProcessed)
168 .def(
"set_label", (
void(State::*)(
const char*)) & State::SetLabel)
170 .def_property_readonly(
"iterations", &State::iterations)
171 .def_readwrite(
"counters", &State::counters)
172 .def_property_readonly(
"thread_index", &State::thread_index)
177 py::return_value_policy::reference);
178 m.def(
"RunSpecifiedBenchmarks",