// SPDX-License-Identifier: MIT
// ns per call of generated string functions, against a hand-written baseline.
#include "bench.hh"
#include <charconv>
#include <chrono>
#include <cstdio>
#include <string>
namespace
{
constexpr int Calls = 1000000;
std::string HandWritten( std::string const &user, int count )
{
std::string result;
result.reserve( 64 );
result += "Hello, ";
result += user;
result += "! You have ";
char buffer[16];
std::to_chars_result const written = std::to_chars( buffer, buffer + sizeof buffer, count );
result.append( buffer, written.ptr );
result += " new messages.";
return result;
}
template <typename F>
void Run( const char *name, F f )
{
std::size_t sink = 0;
auto const start = std::chrono::steady_clock::now( );
for ( int i = 0; i < Calls; ++i )
{
sink += f( i ).size( );
}
std::chrono::duration<double, std::nano> const elapsed = std::chrono::steady_clock::now( ) - start;
std::printf( "%-36s %8.1f ns/call (%zu)\n", name, elapsed.count( ) / Calls, sink );
}
}
int main( )
{
std::string const user = "Ada";
std::locale const classic = std::locale::classic( );
Run( "hand-written append (baseline)", [&]( int i ) { return HandWritten( user, i ); } );
Run( "PlainStr()", [&]( int ) { return bench::PlainStr( ); } );
Run( "SingleStr(user, n)", [&]( int i ) { return bench::SingleStr( user, i ); } );
Run( "SingleStr(user, n, loc)", [&]( int i ) { return bench::SingleStr( user, i, classic ); } );
Run( "FiveStr(user, n) 5 languages", [&]( int i ) { return bench::FiveStr( user, i ); } );
Run( "FiveStr(user, n, loc) 5 languages", [&]( int i ) { return bench::FiveStr( user, i, classic ); } );
}