The following code example is taken from the book
C++20 - The Complete Guide
by Nicolai M. Josuttis,
Leanpub, 2021
The code is licensed under a
Creative Commons Attribution 4.0 International License.
// raw code
#include <iostream>
#include <string>
#include <sstream>
#include <charconv>
#include <chrono>
#ifdef __cpp_lib_format
#include <format>
#else
#include <fmt/format.h>
#endif
static void checkSPrintf(int num) {
for (int idx = 0; idx < num; ++idx) {
int i = 42;
double d = 7.7;
char buf[100] = {'?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?'};
sprintf(buf, "%d %f", i, d);
if (num == 1) {
std::cout << buf << '\n';
return;
}
}
}
static void checkOStringStream(int num) {
for (int idx = 0; idx < num; ++idx) {
int i = 42;
double d = 7.7;
std::ostringstream os;
os << i << ' ' << d;
if (num == 1) {
std::cout << os.str() << '\n';
return;
}
}
}
static void checkToString(int num) {
for (int idx = 0; idx < num; ++idx) {
int i = 42;
double d = 7.7;
std::string s = std::to_string(i) + ' ' + std::to_string(d);
if (num == 1) {
std::cout << s << '\n';
return;
}
}
}
static void checkToChars(int num) {
for (int idx = 0; idx < num; ++idx) {
int i = 42;
double d = 7.7;
char buf[100] = {'?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?'};
std::to_chars_result res = std::to_chars(buf, buf+9, i);
*res.ptr = ' ';
res = std::to_chars(res.ptr+1, res.ptr+10, d);
*res.ptr = '\0';
if (num == 1) {
std::cout << buf << '\n';
return;
}
}
}
static void checkFormat(int num) {
for (int idx = 0; idx < num; ++idx) {
int i = 42;
double d = 7.7;
#ifdef __cpp_lib_format
auto s = std::format("{} {}", i, d);
#else
auto s = fmt::v8::format("{} {}", i, d);
#endif
if (num == 1) {
std::cout << s << '\n';
return;
}
}
}
static void checkFormatTo(int num) {
for (int idx = 0; idx < num; ++idx) {
int i = 42;
double d = 7.7;
char buf[100] = {'?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?'};
#ifdef __cpp_lib_format
auto ret = std::format_to_n(buf, 99, "{} {}", i, d);
*(ret.out) = '\0';
#else
auto ret = fmt::v8::format_to(buf, "{} {}", i, d);
*ret = '\0';
#endif
if (num == 1) {
std::cout << buf << '\n';
return;
}
}
}
template<typename T>
void measure(std::string s, T func)
{
auto t0 = std::chrono::steady_clock::now();
func(1000); // measure
auto t1 = std::chrono::steady_clock::now();
std::chrono::duration<double, std::milli> diff{t1 - t0};
std::cout << s << ": " << diff.count() << "ms\n ";
func(1); // show output
}
int main()
{
measure("sprintf() ", checkSPrintf);
measure("ostringstream", checkOStringStream);
measure("to_string() ", checkToString);
measure("to_chars() ", checkToChars);
measure("format() ", checkFormat);
measure("format_to() ", checkFormatTo);
}