Code View

// 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 ); } );
}