114 const std::vector<std::function<Result_()> >& funs,
115 const std::function<
void(
const Result_&, std::size_t)>& check,
118 const auto nfun = funs.size();
123 std::mt19937_64 rng(opt.
seed);
124 std::vector<std::size_t> order;
125 order.reserve(num_iterations * nfun);
126 for (
int i = 0; i < num_iterations; ++i) {
127 for (std::size_t f = 0; f < nfun; ++f) {
130 std::shuffle(order.end() - nfun, order.end(), rng);
133 std::vector<Timings> output(nfun);
134 auto total_time = std::chrono::duration<double>(0);
135 auto oIt = order.begin();
137 for (
int i = 0; i < num_iterations; ++i) {
142 for (std::size_t f = 0; f < nfun; ++f, ++oIt) {
143 const auto current = *oIt;
144 auto& curout = output[current];
155 const auto start = std::chrono::steady_clock::now();
156 auto res = funs[current]();
157 const auto end = std::chrono::steady_clock::now();
158 const auto curtime = std::chrono::duration_cast<std::chrono::duration<double> >(end - start);
159 curout.times.push_back(curtime);
163 curout.mean += curtime;
165 total_time += curtime;
171 assert(oIt == order.end());
172 for (
auto& curout : output) {
175 curout.times.erase(curout.times.begin(), curout.times.begin() + opt.
burn_in);
176 if (curout.times.empty()) {
181 curout.mean /= curout.times.size();
182 for (
const auto id : curout.times) {
183 const double delta = (
id - curout.mean).count();
184 curout.sd += std::chrono::duration<double>(delta * delta);
186 curout.sd /= curout.times.size() - 1;
187 curout.sd = std::chrono::duration<double>(std::sqrt(curout.sd.count()));
std::vector< Timings > time(const std::vector< std::function< Result_()> > &funs, const std::function< void(const Result_ &, std::size_t)> &check, const Options &opt)
Definition eztimer.hpp:113