forked from catchorg/Catch2
		
	Changes done to Nonius: * Moved things into "Catch::Benchmark" namespace * Benchmarks were integrated with `TEST_CASE`/`SECTION`/`GENERATE` macros * Removed Nonius's parameters for benchmarks, Generators should be used instead * Added relevant methods to the reporter interface (default-implemented, to avoid breaking existing 3rd party reporters) * Async processing is guarded with `_REENTRANT` macro for GCC/Clang, used by default on MSVC * Added a macro `CATCH_CONFIG_DISABLE_BENCHMARKING` that removes all traces of benchmarking from Catch
		
			
				
	
	
		
			59 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 *  Created by Joachim on 16/04/2019.
 | 
						|
 *  Adapted from donated nonius code.
 | 
						|
 *
 | 
						|
 *  Distributed under the Boost Software License, Version 1.0. (See accompanying
 | 
						|
 *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
						|
 */
 | 
						|
 | 
						|
 // Execution plan
 | 
						|
 | 
						|
#ifndef TWOBLUECUBES_CATCH_EXECUTION_PLAN_HPP_INCLUDED
 | 
						|
#define TWOBLUECUBES_CATCH_EXECUTION_PLAN_HPP_INCLUDED
 | 
						|
 | 
						|
#include "../catch_config.hpp"
 | 
						|
#include "catch_clock.hpp"
 | 
						|
#include "catch_environment.hpp"
 | 
						|
#include "detail/catch_benchmark_function.hpp"
 | 
						|
#include "detail/catch_repeat.hpp"
 | 
						|
#include "detail/catch_run_for_at_least.hpp"
 | 
						|
 | 
						|
#include <algorithm>
 | 
						|
 | 
						|
namespace Catch {
 | 
						|
    namespace Benchmark {
 | 
						|
        template <typename Duration>
 | 
						|
        struct ExecutionPlan {
 | 
						|
            int iterations_per_sample;
 | 
						|
            Duration estimated_duration;
 | 
						|
            Detail::BenchmarkFunction benchmark;
 | 
						|
            Duration warmup_time;
 | 
						|
            int warmup_iterations;
 | 
						|
 | 
						|
            template <typename Duration2>
 | 
						|
            operator ExecutionPlan<Duration2>() const {
 | 
						|
                return { iterations_per_sample, estimated_duration, benchmark, warmup_time, warmup_iterations };
 | 
						|
            }
 | 
						|
 | 
						|
            template <typename Clock>
 | 
						|
            std::vector<FloatDuration<Clock>> run(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const {
 | 
						|
                // warmup a bit
 | 
						|
                Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_iterations, Detail::repeat(now<Clock>{}));
 | 
						|
 | 
						|
                std::vector<FloatDuration<Clock>> times;
 | 
						|
                times.reserve(cfg.benchmarkSamples());
 | 
						|
                std::generate_n(std::back_inserter(times), cfg.benchmarkSamples(), [this, env] {
 | 
						|
                    Detail::ChronometerModel<Clock> model;
 | 
						|
                    this->benchmark(Chronometer(model, iterations_per_sample));
 | 
						|
                    auto sample_time = model.elapsed() - env.clock_cost.mean;
 | 
						|
                    if (sample_time < FloatDuration<Clock>::zero()) sample_time = FloatDuration<Clock>::zero();
 | 
						|
                    return sample_time / iterations_per_sample;
 | 
						|
                });
 | 
						|
                return times;
 | 
						|
            }
 | 
						|
        };
 | 
						|
    } // namespace Benchmark
 | 
						|
} // namespace Catch
 | 
						|
 | 
						|
#endif // TWOBLUECUBES_CATCH_EXECUTION_PLAN_HPP_INCLUDED
 |