summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/variant2/benchmark
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/variant2/benchmark')
-rw-r--r--src/boost/libs/variant2/benchmark/benchmark1.cpp168
-rw-r--r--src/boost/libs/variant2/benchmark/benchmark1.md267
-rw-r--r--src/boost/libs/variant2/benchmark/benchmark2.cpp149
-rw-r--r--src/boost/libs/variant2/benchmark/benchmark2.md207
4 files changed, 791 insertions, 0 deletions
diff --git a/src/boost/libs/variant2/benchmark/benchmark1.cpp b/src/boost/libs/variant2/benchmark/benchmark1.cpp
new file mode 100644
index 000000000..703f89114
--- /dev/null
+++ b/src/boost/libs/variant2/benchmark/benchmark1.cpp
@@ -0,0 +1,168 @@
+// 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 <boost/variant2/variant.hpp>
+#endif
+
+#if !defined(NO_BV)
+#include <boost/variant.hpp>
+#endif
+
+#if !defined(NO_SV)
+#include <variant>
+#endif
+
+#include <type_traits>
+#include <chrono>
+#include <iostream>
+#include <iomanip>
+#include <vector>
+#include <map>
+#include <string>
+#include <stdexcept>
+
+template<class T> struct is_numeric: std::integral_constant<bool, std::is_integral<T>::value || std::is_floating_point<T>::value>
+{
+};
+
+template<class T, class U> struct have_addition: std::integral_constant<bool, is_numeric<T>::value && is_numeric<U>::value>
+{
+};
+
+template<class T, class U, class E = std::enable_if_t<have_addition<T, U>::value>> auto add( T const& t, U const& u )
+{
+ return t + u;
+}
+
+template<class T, class U, class E = std::enable_if_t<!have_addition<T, U>::value>> double add( T const& /*t*/, U const& /*u*/ )
+{
+ throw std::logic_error( "Invalid addition" );
+}
+
+inline double to_double( double const& v )
+{
+ return v;
+}
+
+#if !defined(NO_V2)
+
+template<class... T> boost::variant2::variant<T...> operator+( boost::variant2::variant<T...> const& v1, boost::variant2::variant<T...> const& v2 )
+{
+ return visit( [&]( auto const& x1, auto const & x2 ) -> boost::variant2::variant<T...> { return add( x1, x2 ); }, v1, v2 );
+}
+
+template<class... T> double to_double( boost::variant2::variant<T...> const& v )
+{
+ return boost::variant2::get<double>( v );
+}
+
+#endif
+
+#if !defined(NO_BV)
+
+template<class... T> boost::variant<T...> operator+( boost::variant<T...> const& v1, boost::variant<T...> const& v2 )
+{
+ return boost::apply_visitor( [&]( auto const& x1, auto const & x2 ) -> boost::variant<T...> { return add( x1, x2 ); }, v1, v2 );
+}
+
+template<class... T> double to_double( boost::variant<T...> const& v )
+{
+ return boost::get<double>( v );
+}
+
+#endif
+
+#if !defined(NO_SV)
+
+template<class... T> std::variant<T...> operator+( std::variant<T...> const& v1, std::variant<T...> const& v2 )
+{
+ return visit( [&]( auto const& x1, auto const & x2 ) -> std::variant<T...> { return add( x1, x2 ); }, v1, v2 );
+}
+
+template<class... T> double to_double( std::variant<T...> const& v )
+{
+ return std::get<double>( v );
+}
+
+#endif
+
+template<class V> void test_( long long N )
+{
+ std::vector<V> w;
+ // lack of reserve is deliberate
+
+ auto tp1 = std::chrono::high_resolution_clock::now();
+
+ for( long long i = 0; i < N; ++i )
+ {
+ V v;
+
+ if( i % 7 == 0 )
+ {
+ v = i / 7;
+ }
+ else
+ {
+ v = i / 7.0;
+ }
+
+ w.push_back( v );
+ }
+
+ V s = 0.0;
+
+ for( long long i = 0; i < N; ++i )
+ {
+ s = s + w[ i ];
+ }
+
+ auto tp2 = std::chrono::high_resolution_clock::now();
+
+ std::cout << std::setw( 6 ) << std::chrono::duration_cast<std::chrono::milliseconds>( tp2 - tp1 ).count() << " ms; S=" << to_double( s ) << "\n";
+}
+
+template<class... T> void test( long long N )
+{
+ std::cout << "N=" << N << ":\n";
+
+ std::cout << " double: "; test_<double>( N );
+#if !defined(NO_V2)
+ std::cout << " variant2: "; test_<boost::variant2::variant<T...>>( N );
+#endif
+#if !defined(NO_BV)
+ std::cout << "boost::variant: "; test_<boost::variant<T...>>( N );
+#endif
+#if !defined(NO_SV)
+ std::cout << " std::variant: "; test_<std::variant<T...>>( N );
+#endif
+
+ std::cout << '\n';
+}
+
+int main()
+{
+ long long const N = 100'000'000LL;
+
+ test<long long, double>( N );
+ test<std::nullptr_t, long long, double, std::string, std::vector<std::string>, std::map<std::string, std::string>>( N );
+}
diff --git a/src/boost/libs/variant2/benchmark/benchmark1.md b/src/boost/libs/variant2/benchmark/benchmark1.md
new file mode 100644
index 000000000..aa3bb933a
--- /dev/null
+++ b/src/boost/libs/variant2/benchmark/benchmark1.md
@@ -0,0 +1,267 @@
+# benchmark1.cpp results
+
+## VS 2017 15.9.7 64 bit (cl.exe 19.16, /EHsc /std:c++17)
+
+### /Od
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 1837 ms
+boost::variant (-DONLY_BV): 2627 ms
+ std::variant (-DONLY_SV): 1425 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ double: 9041 ms; S=7.14286e+14
+ variant2: 48367 ms; S=7.14286e+14
+boost::variant: 102776 ms; S=7.14286e+14
+ std::variant: 40590 ms; S=7.14286e+14
+
+N=100000000:
+ double: 9029 ms; S=7.14286e+14
+ variant2: 92962 ms; S=7.14286e+14
+boost::variant: 110441 ms; S=7.14286e+14
+ std::variant: 92974 ms; S=7.14286e+14
+```
+
+### /O2 /DNDEBUG
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 2571 ms
+boost::variant (-DONLY_BV): 3335 ms
+ std::variant (-DONLY_SV): 1903 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ double: 1949 ms; S=7.14286e+14
+ variant2: 4176 ms; S=7.14286e+14
+boost::variant: 11312 ms; S=7.14286e+14
+ std::variant: 4617 ms; S=7.14286e+14
+
+N=100000000:
+ double: 1949 ms; S=7.14286e+14
+ variant2: 11807 ms; S=7.14286e+14
+boost::variant: 15632 ms; S=7.14286e+14
+ std::variant: 10725 ms; S=7.14286e+14
+```
+
+## g++ 7.4.0 -std=c++17 (Cygwin 64 bit)
+
+### -O0
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 2734 ms
+boost::variant (-DONLY_BV): 4308 ms
+ std::variant (-DONLY_SV): 2298 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ double: 3620 ms; S=7.14286e+14
+ variant2: 29214 ms; S=7.14286e+14
+boost::variant: 88492 ms; S=7.14286e+14
+ std::variant: 39510 ms; S=7.14286e+14
+
+N=100000000:
+ double: 3642 ms; S=7.14286e+14
+ variant2: 75822 ms; S=7.14286e+14
+boost::variant: 96680 ms; S=7.14286e+14
+ std::variant: 66411 ms; S=7.14286e+14
+```
+
+### -O1
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 2103 ms
+boost::variant (-DONLY_BV): 3398 ms
+ std::variant (-DONLY_SV): 1841 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ double: 1576 ms; S=7.14286e+14
+ variant2: 3424 ms; S=7.14286e+14
+boost::variant: 4356 ms; S=7.14286e+14
+ std::variant: 3764 ms; S=7.14286e+14
+
+N=100000000:
+ double: 1582 ms; S=7.14286e+14
+ variant2: 9062 ms; S=7.14286e+14
+boost::variant: 9603 ms; S=7.14286e+14
+ std::variant: 8825 ms; S=7.14286e+14
+```
+
+### -O2 -DNDEBUG
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 2276 ms
+boost::variant (-DONLY_BV): 3647 ms
+ std::variant (-DONLY_SV): 2111 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ double: 1643 ms; S=7.14286e+14
+ variant2: 3070 ms; S=7.14286e+14
+boost::variant: 3385 ms; S=7.14286e+14
+ std::variant: 3880 ms; S=7.14286e+14
+
+N=100000000:
+ double: 1622 ms; S=7.14286e+14
+ variant2: 8101 ms; S=7.14286e+14
+boost::variant: 8611 ms; S=7.14286e+14
+ std::variant: 8694 ms; S=7.14286e+14
+```
+
+### -O3 -DNDEBUG
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 2390 ms
+boost::variant (-DONLY_BV): 3768 ms
+ std::variant (-DONLY_SV): 2094 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ double: 1611 ms; S=7.14286e+14
+ variant2: 2975 ms; S=7.14286e+14
+boost::variant: 3232 ms; S=7.14286e+14
+ std::variant: 3726 ms; S=7.14286e+14
+
+N=100000000:
+ double: 1603 ms; S=7.14286e+14
+ variant2: 8157 ms; S=7.14286e+14
+boost::variant: 8419 ms; S=7.14286e+14
+ std::variant: 8659 ms; S=7.14286e+14
+```
+
+## clang++ 5.0.1 -std=c++17 -stdlib=libc++ (Cygwin 64 bit)
+
+### -O0
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 2190 ms
+boost::variant (-DONLY_BV): 3537 ms
+ std::variant (-DONLY_SV): 2151 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ double: 6063 ms; S=7.14286e+14
+ variant2: 23616 ms; S=7.14286e+14
+boost::variant: 92730 ms; S=7.14286e+14
+ std::variant: 23160 ms; S=7.14286e+14
+
+N=100000000:
+ double: 6054 ms; S=7.14286e+14
+ variant2: 52738 ms; S=7.14286e+14
+boost::variant: 96896 ms; S=7.14286e+14
+ std::variant: 72595 ms; S=7.14286e+14
+```
+
+### -O1
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 2722 ms
+boost::variant (-DONLY_BV): 4337 ms
+ std::variant (-DONLY_SV): 2697 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ double: 2171 ms; S=7.14286e+14
+ variant2: 9280 ms; S=7.14286e+14
+boost::variant: 51478 ms; S=7.14286e+14
+ std::variant: 5642 ms; S=7.14286e+14
+
+N=100000000:
+ double: 2171 ms; S=7.14286e+14
+ variant2: 22166 ms; S=7.14286e+14
+boost::variant: 54084 ms; S=7.14286e+14
+ std::variant: 14330 ms; S=7.14286e+14
+```
+
+### -O2 -DNDEBUG
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 2499 ms
+boost::variant (-DONLY_BV): 3826 ms
+ std::variant (-DONLY_SV): 2645 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ double: 1604 ms; S=7.14286e+14
+ variant2: 2726 ms; S=7.14286e+14
+boost::variant: 6662 ms; S=7.14286e+14
+ std::variant: 3869 ms; S=7.14286e+14
+
+N=100000000:
+ double: 1598 ms; S=7.14286e+14
+ variant2: 8136 ms; S=7.14286e+14
+boost::variant: 9236 ms; S=7.14286e+14
+ std::variant: 6279 ms; S=7.14286e+14
+```
+
+### -O3 -DNDEBUG
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 2509 ms
+boost::variant (-DONLY_BV): 3845 ms
+ std::variant (-DONLY_SV): 2638 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ double: 1592 ms; S=7.14286e+14
+ variant2: 2697 ms; S=7.14286e+14
+boost::variant: 6648 ms; S=7.14286e+14
+ std::variant: 3826 ms; S=7.14286e+14
+
+N=100000000:
+ double: 1614 ms; S=7.14286e+14
+ variant2: 8035 ms; S=7.14286e+14
+boost::variant: 9221 ms; S=7.14286e+14
+ std::variant: 6319 ms; S=7.14286e+14
+```
diff --git a/src/boost/libs/variant2/benchmark/benchmark2.cpp b/src/boost/libs/variant2/benchmark/benchmark2.cpp
new file mode 100644
index 000000000..bea5f3a95
--- /dev/null
+++ b/src/boost/libs/variant2/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 <boost/variant2/variant.hpp>
+#endif
+
+#if !defined(NO_BV)
+#include <boost/variant.hpp>
+#endif
+
+#if !defined(NO_SV)
+#include <variant>
+#endif
+
+#include <type_traits>
+#include <chrono>
+#include <iostream>
+#include <iomanip>
+#include <vector>
+
+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<class... T> int get_value( boost::variant2::variant<T...> const& v )
+{
+ return visit( []( prefix const& x ) { return x.v_; }, v );
+}
+
+#endif
+
+#if !defined(NO_BV)
+
+template<class... T> int get_value( boost::variant<T...> const& v )
+{
+ return boost::apply_visitor( []( prefix const& x ) { return x.v_; }, v );
+}
+
+#endif
+
+#if !defined(NO_SV)
+
+template<class... T> int get_value( std::variant<T...> const& v )
+{
+ return visit( []( prefix const& x ) { return x.v_; }, v );
+}
+
+#endif
+
+template<class V> void test_( int N )
+{
+ std::vector<V> 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<std::chrono::milliseconds>( tp2 - tp1 ).count() << " ms; S=" << s << "\n";
+}
+
+template<class... T> void test( int N )
+{
+ std::cout << "N=" << N << ":\n";
+
+ std::cout << " prefix: "; test_<prefix>( N );
+#if !defined(NO_V2)
+ std::cout << " variant2: "; test_<boost::variant2::variant<T...>>( N );
+#endif
+#if !defined(NO_BV)
+ std::cout << "boost::variant: "; test_<boost::variant<T...>>( N );
+#endif
+#if !defined(NO_SV)
+ std::cout << " std::variant: "; test_<std::variant<T...>>( N );
+#endif
+
+ std::cout << '\n';
+}
+
+int main()
+{
+ int const N = 100'000'000;
+
+ test<X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12>( N );
+}
diff --git a/src/boost/libs/variant2/benchmark/benchmark2.md b/src/boost/libs/variant2/benchmark/benchmark2.md
new file mode 100644
index 000000000..9aad6488a
--- /dev/null
+++ b/src/boost/libs/variant2/benchmark/benchmark2.md
@@ -0,0 +1,207 @@
+# benchmark2.cpp results
+
+## VS 2017 15.9.7 64 bit (cl.exe 19.16, /EHsc /std:c++17)
+
+### /Od
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 1403 ms
+boost::variant (-DONLY_BV): 2972 ms
+ std::variant (-DONLY_SV): 1057 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ prefix: 7016 ms; S=416666583333336
+ variant2: 24723 ms; S=416666583333336
+boost::variant: 60438 ms; S=416666583333336
+ std::variant: 20707 ms; S=416666583333336
+```
+
+### /O2 /DNDEBUG
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 1778 ms
+boost::variant (-DONLY_BV): 3252 ms
+ std::variant (-DONLY_SV): 1372 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ prefix: 803 ms; S=416666583333336
+ variant2: 2124 ms; S=416666583333336
+boost::variant: 6191 ms; S=416666583333336
+ std::variant: 2193 ms; S=416666583333336
+```
+
+## g++ 7.4.0 -std=c++17 (Cygwin 64 bit)
+
+### -O0
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 1739 ms
+boost::variant (-DONLY_BV): 3113 ms
+ std::variant (-DONLY_SV): 1719 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ prefix: 5163 ms; S=416666583333336
+ variant2: 20628 ms; S=416666583333336
+boost::variant: 43308 ms; S=416666583333336
+ std::variant: 42375 ms; S=416666583333336
+```
+
+### -O1
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 1484 ms
+boost::variant (-DONLY_BV): 2947 ms
+ std::variant (-DONLY_SV): 1448 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ prefix: 781 ms; S=416666583333336
+ variant2: 1992 ms; S=416666583333336
+boost::variant: 2249 ms; S=416666583333336
+ std::variant: 4843 ms; S=416666583333336
+```
+
+### -O2 -DNDEBUG
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 1547 ms
+boost::variant (-DONLY_BV): 2999 ms
+ std::variant (-DONLY_SV): 1528 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ prefix: 793 ms; S=416666583333336
+ variant2: 1686 ms; S=416666583333336
+boost::variant: 1833 ms; S=416666583333336
+ std::variant: 4340 ms; S=416666583333336
+```
+
+### -O3 -DNDEBUG
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 1595 ms
+boost::variant (-DONLY_BV): 3084 ms
+ std::variant (-DONLY_SV): 1620 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ prefix: 853 ms; S=416666583333336
+ variant2: 1681 ms; S=416666583333336
+boost::variant: 1773 ms; S=416666583333336
+ std::variant: 3989 ms; S=416666583333336
+```
+
+## clang++ 5.0.1 -std=c++17 -stdlib=libc++ (Cygwin 64 bit)
+
+### -O0
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 1578 ms
+boost::variant (-DONLY_BV): 2623 ms
+ std::variant (-DONLY_SV): 1508 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ prefix: 4447 ms; S=416666583333336
+ variant2: 16016 ms; S=416666583333336
+boost::variant: 42365 ms; S=416666583333336
+ std::variant: 17817 ms; S=416666583333336
+```
+
+### -O1
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 1841 ms
+boost::variant (-DONLY_BV): 2919 ms
+ std::variant (-DONLY_SV): 1776 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ prefix: 1390 ms; S=416666583333336
+ variant2: 5397 ms; S=416666583333336
+boost::variant: 23234 ms; S=416666583333336
+ std::variant: 2807 ms; S=416666583333336
+```
+
+### -O2 -DNDEBUG
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 1766 ms
+boost::variant (-DONLY_BV): 2817 ms
+ std::variant (-DONLY_SV): 1718 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ prefix: 604 ms; S=416666583333336
+ variant2: 1625 ms; S=416666583333336
+boost::variant: 2735 ms; S=416666583333336
+ std::variant: 2664 ms; S=416666583333336
+```
+
+### -O3 -DNDEBUG
+
+#### Compile time
+
+```
+ variant2 (-DONLY_V2): 1720 ms
+boost::variant (-DONLY_BV): 2806 ms
+ std::variant (-DONLY_SV): 1737 ms
+```
+
+#### Run time
+
+```
+N=100000000:
+ prefix: 603 ms; S=416666583333336
+ variant2: 1608 ms; S=416666583333336
+boost::variant: 2696 ms; S=416666583333336
+ std::variant: 2668 ms; S=416666583333336
+```