// 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 constexpr unsigned N = 2'000'000; constexpr int K = 10; 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 ) { data.push_back( static_cast( static_cast::type>( rng() ) ) ); } } using namespace std::chrono_literals; template static BOOST_NOINLINE void test_snprintf( std::vector const& data ) { auto t1 = std::chrono::steady_clock::now(); std::size_t s = 0; char const* format = "%d"; BOOST_IF_CONSTEXPR( std::is_same::value ) { format = "%u"; } BOOST_IF_CONSTEXPR( std::is_same::value ) { format = "%ld"; } BOOST_IF_CONSTEXPR( std::is_same::value ) { format = "%lu"; } BOOST_IF_CONSTEXPR( std::is_same::value ) { format = "%lld"; } BOOST_IF_CONSTEXPR( std::is_same::value ) { format = "%llu"; } for( int i = 0; i < K; ++i ) { char buffer[ 22 ]; for( auto x: data ) { auto r = std::snprintf( buffer, sizeof( buffer ), format, x ); s += r; s += static_cast( buffer[0] ); } } auto t2 = std::chrono::steady_clock::now(); std::cout << " std::snprintf<" << boost::core::type_name() << ">: " << std::setw( 5 ) << ( t2 - t1 ) / 1ms << " ms (s=" << s << ")\n"; } template static BOOST_NOINLINE void test_std_to_chars( std::vector const& data ) { auto t1 = std::chrono::steady_clock::now(); std::size_t s = 0; for( int i = 0; i < K; ++i ) { char buffer[ 21 ]; for( auto x: data ) { auto r = std::to_chars( buffer, buffer + sizeof( buffer ), x ); s += static_cast( r.ptr - buffer ); s += static_cast( buffer[0] ); } } auto t2 = std::chrono::steady_clock::now(); std::cout << " std::to_chars<" << boost::core::type_name() << ">: " << std::setw( 5 ) << ( t2 - t1 ) / 1ms << " ms (s=" << s << ")\n"; } template static BOOST_NOINLINE void test_boost_to_chars( std::vector const& data ) { auto t1 = std::chrono::steady_clock::now(); std::size_t s = 0; for( int i = 0; i < K; ++i ) { char buffer[ 21 ]; for( auto x: data ) { auto r = boost::charconv::to_chars( buffer, buffer + sizeof( buffer ), x ); s += static_cast( r.ptr - buffer ); s += static_cast( buffer[0] ); } } auto t2 = std::chrono::steady_clock::now(); std::cout << "boost::charconv::to_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_snprintf( data ); test_std_to_chars( data ); test_boost_to_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(); }