mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-11-04 09:01:50 +01:00 
			
		
		
		
	
		
			
	
	
		
			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
							 |