// Copyright 2023 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include #include #include #include #include #include #include #include constexpr unsigned N = 2'000'000; constexpr int K = 25; template static BOOST_NOINLINE void init_input_data( std::vector& data ) { data.reserve( N ); boost::detail::splitmix64 rng; for( unsigned i = 0; i < N; ++i ) { T x = static_cast( static_cast::type>( rng() ) ); char buffer[ 21 ]; auto r = boost::charconv::to_chars( buffer, buffer + sizeof( buffer ), x ); std::string y( buffer, r.ptr ); data.push_back( y ); } } using namespace std::chrono_literals; template static void BOOST_NOINLINE test_std_from_chars( std::vector const& data ) { auto t1 = std::chrono::steady_clock::now(); std::size_t s = 0; for( int i = 0; i < K; ++i ) { for( auto const& x: data ) { T y; std::from_chars( x.data(), x.data() + x.size(), y ); s += static_cast( y ); } } auto t2 = std::chrono::steady_clock::now(); std::cout << " std::from_chars<" << boost::core::type_name() << ">: " << std::setw( 5 ) << ( t2 - t1 ) / 1ms << " ms (s=" << s << ")\n"; } template static void BOOST_NOINLINE test_boost_from_chars( std::vector const& data ) { auto t1 = std::chrono::steady_clock::now(); std::size_t s = 0; for( int i = 0; i < K; ++i ) { for( auto const& x: data ) { T y; boost::charconv::from_chars( x.data(), x.data() + x.size(), y ); s += static_cast( y ); } } auto t2 = std::chrono::steady_clock::now(); std::cout << "boost::charconv::from_chars<" << boost::core::type_name() << ">: " << std::setw( 5 ) << ( t2 - t1 ) / 1ms << " ms (s=" << s << ")\n"; } template static void test() { std::vector data; init_input_data( data ); test_std_from_chars( data ); test_boost_from_chars( data ); std::cout << std::endl; } int main() { std::cout << BOOST_COMPILER << "\n"; std::cout << BOOST_STDLIB << "\n\n"; test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); }