1 /* 2 * Created by Phil on 04/07/2017. 3 * Copyright 2017 Two Blue Cubes Ltd. All rights reserved. 4 * 5 * Distributed under the Boost Software License, Version 1.0. (See accompanying 6 * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 */ 8 #ifndef TWOBLUECUBES_CATCH_BENCHMARK_H_INCLUDED 9 #define TWOBLUECUBES_CATCH_BENCHMARK_H_INCLUDED 10 11 #include "catch_stringref.h" 12 #include "catch_timer.h" 13 14 #include <cstdint> 15 #include <string> 16 17 namespace Catch { 18 19 class BenchmarkLooper { 20 21 std::string m_name; 22 std::size_t m_count = 0; 23 std::size_t m_iterationsToRun = 1; 24 uint64_t m_resolution; 25 Timer m_timer; 26 27 static auto getResolution() -> uint64_t; 28 public: 29 // Keep most of this inline as it's on the code path that is being timed BenchmarkLooper(StringRef name)30 BenchmarkLooper( StringRef name ) 31 : m_name( name ), 32 m_resolution( getResolution() ) 33 { 34 reportStart(); 35 m_timer.start(); 36 } 37 38 explicit operator bool() { 39 if( m_count < m_iterationsToRun ) 40 return true; 41 return needsMoreIterations(); 42 } 43 increment()44 void increment() { 45 ++m_count; 46 } 47 48 void reportStart(); 49 auto needsMoreIterations() -> bool; 50 }; 51 52 } // end namespace Catch 53 54 #define BENCHMARK( name ) \ 55 for( Catch::BenchmarkLooper looper( name ); looper; looper.increment() ) 56 57 #endif // TWOBLUECUBES_CATCH_BENCHMARK_H_INCLUDED 58