From 3d946ecb711cea4012f8af1ad2ed8e72065445b1 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Mon, 25 Feb 2019 18:59:49 +0200 Subject: [PATCH] Add benchmark2.cpp --- benchmark/benchmark1.cpp | 7 ++ benchmark/benchmark2.cpp | 149 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 benchmark/benchmark2.cpp diff --git a/benchmark/benchmark1.cpp b/benchmark/benchmark1.cpp index 07cd5d0..703f891 100644 --- a/benchmark/benchmark1.cpp +++ b/benchmark/benchmark1.cpp @@ -1,3 +1,10 @@ +// Copyright 2019 Peter Dimov +// +// 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 + #if defined(ONLY_V2) # define NO_BV # define NO_SV diff --git a/benchmark/benchmark2.cpp b/benchmark/benchmark2.cpp new file mode 100644 index 0000000..bea5f3a --- /dev/null +++ b/benchmark/benchmark2.cpp @@ -0,0 +1,149 @@ +// Copyright 2019 Peter Dimov +// +// 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 + +#if defined(ONLY_V2) +# define NO_BV +# define NO_SV +#endif + +#if defined(ONLY_BV) +# define NO_V2 +# define NO_SV +#endif + +#if defined(ONLY_SV) +# define NO_V2 +# define NO_BV +#endif + +#if !defined(NO_V2) +#include +#endif + +#if !defined(NO_BV) +#include +#endif + +#if !defined(NO_SV) +#include +#endif + +#include +#include +#include +#include +#include + +struct prefix +{ + int v_; +}; + +struct X1: prefix {}; +struct X2: prefix {}; +struct X3: prefix {}; +struct X4: prefix {}; +struct X5: prefix {}; +struct X6: prefix {}; +struct X7: prefix {}; +struct X8: prefix {}; +struct X9: prefix {}; +struct X10: prefix {}; +struct X11: prefix {}; +struct X12: prefix {}; + +inline int get_value( prefix const& v ) +{ + return v.v_; +} + +#if !defined(NO_V2) + +template int get_value( boost::variant2::variant const& v ) +{ + return visit( []( prefix const& x ) { return x.v_; }, v ); +} + +#endif + +#if !defined(NO_BV) + +template int get_value( boost::variant const& v ) +{ + return boost::apply_visitor( []( prefix const& x ) { return x.v_; }, v ); +} + +#endif + +#if !defined(NO_SV) + +template int get_value( std::variant const& v ) +{ + return visit( []( prefix const& x ) { return x.v_; }, v ); +} + +#endif + +template void test_( int N ) +{ + std::vector w; + // lack of reserve is deliberate + + auto tp1 = std::chrono::high_resolution_clock::now(); + + for( int i = 0; i < N / 12; ++i ) + { + w.push_back( X1{ i } ); + w.push_back( X2{ i } ); + w.push_back( X3{ i } ); + w.push_back( X4{ i } ); + w.push_back( X5{ i } ); + w.push_back( X6{ i } ); + w.push_back( X7{ i } ); + w.push_back( X8{ i } ); + w.push_back( X9{ i } ); + w.push_back( X10{ i } ); + w.push_back( X11{ i } ); + w.push_back( X12{ i } ); + } + + unsigned long long s = 0; + + for( std::size_t i = 0, n = w.size(); i < n; ++i ) + { + s = s + get_value( w[ i ] ); + } + + auto tp2 = std::chrono::high_resolution_clock::now(); + + std::cout << std::setw( 6 ) << std::chrono::duration_cast( tp2 - tp1 ).count() << " ms; S=" << s << "\n"; +} + +template void test( int N ) +{ + std::cout << "N=" << N << ":\n"; + + std::cout << " prefix: "; test_( N ); +#if !defined(NO_V2) + std::cout << " variant2: "; test_>( N ); +#endif +#if !defined(NO_BV) + std::cout << "boost::variant: "; test_>( N ); +#endif +#if !defined(NO_SV) + std::cout << " std::variant: "; test_>( N ); +#endif + + std::cout << '\n'; +} + +int main() +{ + int const N = 100'000'000; + + test( N ); +}