From 7f71f1242f35dc7cba95e146716a8bb5e849edf7 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 2 Feb 2026 14:55:47 -0500 Subject: [PATCH 1/3] updating fmt --- benchmarks/algorithms.h | 46 ++++++++++++++++++++----------------- dependencies/CMakeLists.txt | 2 +- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/benchmarks/algorithms.h b/benchmarks/algorithms.h index 88e55ca..f8b9dea 100644 --- a/benchmarks/algorithms.h +++ b/benchmarks/algorithms.h @@ -18,7 +18,7 @@ #endif #include - +#include #include #include @@ -287,7 +287,9 @@ int to_string(T d, std::span& buffer) { template int fmt_format(T d, std::span& buffer) { - const auto it = fmt::format_to(buffer.data(), "{}", d); + // FMT_COMPILE is a macro provided by the {fmt} library that tells the library to fully process + // a format string at compile time rather than at runtime. + const auto it = fmt::format_to(buffer.data(), FMT_COMPILE("{}"), d); return std::distance(buffer.data(), it); } @@ -516,27 +518,29 @@ int snprintf(T d, std::span& buffer) { template int fmt_format(T d, std::span& buffer) { + // FMT_COMPILE is a macro provided by the {fmt} library that tells the library to fully process + // a format string at compile time rather than at runtime. switch(BenchArgs::fixedSize) { - case 0: return fmt::format_to(buffer.data(), "{}", d) - buffer.data(); - case 1: return fmt::format_to(buffer.data(), "{:.1g}", d) - buffer.data(); - case 2: return fmt::format_to(buffer.data(), "{:.2g}", d) - buffer.data(); - case 3: return fmt::format_to(buffer.data(), "{:.3g}", d) - buffer.data(); - case 4: return fmt::format_to(buffer.data(), "{:.4g}", d) - buffer.data(); - case 5: return fmt::format_to(buffer.data(), "{:.5g}", d) - buffer.data(); - case 6: return fmt::format_to(buffer.data(), "{:.6g}", d) - buffer.data(); - case 7: return fmt::format_to(buffer.data(), "{:.7g}", d) - buffer.data(); - case 8: return fmt::format_to(buffer.data(), "{:.8g}", d) - buffer.data(); - case 9: return fmt::format_to(buffer.data(), "{:.9g}", d) - buffer.data(); - case 10: return fmt::format_to(buffer.data(), "{:.10g}", d) - buffer.data(); - case 11: return fmt::format_to(buffer.data(), "{:.11g}", d) - buffer.data(); - case 12: return fmt::format_to(buffer.data(), "{:.12g}", d) - buffer.data(); - case 13: return fmt::format_to(buffer.data(), "{:.13g}", d) - buffer.data(); - case 14: return fmt::format_to(buffer.data(), "{:.14g}", d) - buffer.data(); - case 15: return fmt::format_to(buffer.data(), "{:.15g}", d) - buffer.data(); - case 16: return fmt::format_to(buffer.data(), "{:.16g}", d) - buffer.data(); - case 17: return fmt::format_to(buffer.data(), "{:.17g}", d) - buffer.data(); + case 0: return fmt::format_to(buffer.data(), FMT_COMPILE("{}"), d) - buffer.data(); + case 1: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.1g}"), d) - buffer.data(); + case 2: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.2g}"), d) - buffer.data(); + case 3: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.3g}"), d) - buffer.data(); + case 4: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.4g}"), d) - buffer.data(); + case 5: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.5g}"), d) - buffer.data(); + case 6: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.6g}"), d) - buffer.data(); + case 7: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.7g}"), d) - buffer.data(); + case 8: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.8g}"), d) - buffer.data(); + case 9: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.9g}"), d) - buffer.data(); + case 10: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.10g}"), d) - buffer.data(); + case 11: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.11g}"), d) - buffer.data(); + case 12: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.12g}"), d) - buffer.data(); + case 13: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.13g}"), d) - buffer.data(); + case 14: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.14g}"), d) - buffer.data(); + case 15: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.15g}"), d) - buffer.data(); + case 16: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.16g}"), d) - buffer.data(); + case 17: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.17g}"), d) - buffer.data(); default: - return fmt::format_to(buffer.data(), "{:.17g}", d) - buffer.data(); + return fmt::format_to(buffer.data(), FMT_COMPILE("{:.17g}"), d) - buffer.data(); } } diff --git a/dependencies/CMakeLists.txt b/dependencies/CMakeLists.txt index 3dc7f81..a2d48b4 100644 --- a/dependencies/CMakeLists.txt +++ b/dependencies/CMakeLists.txt @@ -157,7 +157,7 @@ target_include_directories(dragon_schubfach_lib PUBLIC ${drachennest_SOURCE_DIR}/src ) -CPMAddPackage("gh:fmtlib/fmt#11.1.4") +CPMAddPackage("gh:fmtlib/fmt#12.1.0") CPMAddPackage( GITHUB_REPOSITORY jarro2783/cxxopts VERSION 3.2.0 From 502211a0e84efea069ccd47b8b0e3e14f06e4406 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 2 Feb 2026 15:54:33 -0500 Subject: [PATCH 2/3] removing g --- benchmarks/algorithms.h | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/benchmarks/algorithms.h b/benchmarks/algorithms.h index f8b9dea..21a9eb2 100644 --- a/benchmarks/algorithms.h +++ b/benchmarks/algorithms.h @@ -522,25 +522,25 @@ int fmt_format(T d, std::span& buffer) { // a format string at compile time rather than at runtime. switch(BenchArgs::fixedSize) { case 0: return fmt::format_to(buffer.data(), FMT_COMPILE("{}"), d) - buffer.data(); - case 1: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.1g}"), d) - buffer.data(); - case 2: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.2g}"), d) - buffer.data(); - case 3: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.3g}"), d) - buffer.data(); - case 4: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.4g}"), d) - buffer.data(); - case 5: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.5g}"), d) - buffer.data(); - case 6: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.6g}"), d) - buffer.data(); - case 7: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.7g}"), d) - buffer.data(); - case 8: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.8g}"), d) - buffer.data(); - case 9: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.9g}"), d) - buffer.data(); - case 10: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.10g}"), d) - buffer.data(); - case 11: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.11g}"), d) - buffer.data(); - case 12: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.12g}"), d) - buffer.data(); - case 13: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.13g}"), d) - buffer.data(); - case 14: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.14g}"), d) - buffer.data(); - case 15: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.15g}"), d) - buffer.data(); - case 16: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.16g}"), d) - buffer.data(); - case 17: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.17g}"), d) - buffer.data(); + case 1: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.1}"), d) - buffer.data(); + case 2: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.2}"), d) - buffer.data(); + case 3: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.3}"), d) - buffer.data(); + case 4: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.4}"), d) - buffer.data(); + case 5: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.5}"), d) - buffer.data(); + case 6: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.6}"), d) - buffer.data(); + case 7: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.7}"), d) - buffer.data(); + case 8: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.8}"), d) - buffer.data(); + case 9: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.9}"), d) - buffer.data(); + case 10: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.10}"), d) - buffer.data(); + case 11: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.11}"), d) - buffer.data(); + case 12: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.12}"), d) - buffer.data(); + case 13: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.13}"), d) - buffer.data(); + case 14: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.14}"), d) - buffer.data(); + case 15: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.15}"), d) - buffer.data(); + case 16: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.16}"), d) - buffer.data(); + case 17: return fmt::format_to(buffer.data(), FMT_COMPILE("{:.17}"), d) - buffer.data(); default: - return fmt::format_to(buffer.data(), FMT_COMPILE("{:.17g}"), d) - buffer.data(); + return fmt::format_to(buffer.data(), FMT_COMPILE("{:.17}"), d) - buffer.data(); } } From 1f77c2fba6c7c93676a9dcd9f837503926e2e4a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ja=C3=ABl=20Champagne=20Gareau?= Date: Mon, 2 Feb 2026 22:12:28 -0500 Subject: [PATCH 3/3] add algo version numbers in benchmark results --- benchmarks/algorithms.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/benchmarks/algorithms.h b/benchmarks/algorithms.h index 21a9eb2..a685ab1 100644 --- a/benchmarks/algorithms.h +++ b/benchmarks/algorithms.h @@ -287,7 +287,7 @@ int to_string(T d, std::span& buffer) { template int fmt_format(T d, std::span& buffer) { - // FMT_COMPILE is a macro provided by the {fmt} library that tells the library to fully process + // FMT_COMPILE is a macro provided by the {fmt} library that tells the library to fully process // a format string at compile time rather than at runtime. const auto it = fmt::format_to(buffer.data(), FMT_COMPILE("{}"), d); return std::distance(buffer.data(), it); @@ -518,7 +518,7 @@ int snprintf(T d, std::span& buffer) { template int fmt_format(T d, std::span& buffer) { - // FMT_COMPILE is a macro provided by the {fmt} library that tells the library to fully process + // FMT_COMPILE is a macro provided by the {fmt} library that tells the library to fully process // a format string at compile time rather than at runtime. switch(BenchArgs::fixedSize) { case 0: return fmt::format_to(buffer.data(), FMT_COMPILE("{}"), d) - buffer.data(); @@ -607,13 +607,13 @@ std::vector> initArgs(bool use_errol = false, size_t repeat = 0, si args.emplace_back("dragon4" , wrap(s::dragon4) , true , 10); args.emplace_back("netlib" , wrap(s::netlib) , NETLIB_SUPPORTED && std::is_same_v , 10); args.emplace_back("errol3" , wrap(s::errol3) , ERROL_SUPPORTED && use_errol); - args.emplace_back("fmt_format" , wrap(s::fmt_format) , true); + args.emplace_back("fmt_format 12.1.0" , wrap(s::fmt_format) , true); // args.emplace_back("grisu2" , wrap(s::grisu2) , std::is_same_v); args.emplace_back("grisu3" , wrap(s::grisu3) , std::is_same_v); args.emplace_back("grisu_exact" , wrap(s::grisu_exact) , true); args.emplace_back("schubfach" , wrap(s::schubfach) , true); args.emplace_back("dragonboxlm" , wrap(s::dragonboxlm) , true); - args.emplace_back("dragonbox" , wrap(s::dragonbox) , true); + args.emplace_back("dragonbox 1.1.3" , wrap(s::dragonbox) , true); args.emplace_back("ryu" , wrap(s::ryu) , true); args.emplace_back("teju_jagua" , wrap(s::teju_jagua) , true); args.emplace_back("double_conversion" , wrap(s::double_conversion) , true); @@ -631,7 +631,7 @@ std::vector> initArgs(bool use_errol = false, size_t repeat = 0, si args.emplace_back("netlib" , wrap(f::netlib) , NETLIB_SUPPORTED , 10); args.emplace_back("abseil" , wrap(f::abseil) , ABSEIL_SUPPORTED); args.emplace_back("snprintf" , wrap(f::snprintf) , true); - args.emplace_back("fmt_format" , wrap(f::fmt_format) , true); + args.emplace_back("fmt_format 12.1.0" , wrap(f::fmt_format) , true); args.emplace_back("ryu" , wrap(f::ryu) , std::is_same_v); args.emplace_back("double_conversion" , wrap(f::double_conversion) , true); args.emplace_back("std::to_chars" , wrap(f::std_to_chars) , TO_CHARS_SUPPORTED);