From a39d2573df56b63bc44f477442260a1dc3d96b60 Mon Sep 17 00:00:00 2001 From: Odysseas Georgoudis Date: Sun, 22 Sep 2024 02:41:30 +0100 Subject: [PATCH] Optimise size calculation for fundamental types, std::string, and std::string_view in compute_encoded_size_and_cache_string_lengths --- CHANGELOG.md | 3 ++- include/quill/core/Codec.h | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67d8c82f..73e0466c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -100,7 +100,8 @@ attempting to log `std::string s(std::numeric_limits::max(), 'a');` would previously cause a crash. - Tuned `transit_events_soft_limit` and `transit_events_hard_limit` default values; added error checks for invalid configurations. -- Improved dynamic log level handling by checking at compile-time using `constexpr` on the hot path. +- Improved dynamic log level handling and optimize size calculation for fundamental types, std::string and std:: + string_view on the hot path. - Added support for appending a custom timestamp format to log filenames via `StartCustomTimestampFormat`. Example usage: ```cpp diff --git a/include/quill/core/Codec.h b/include/quill/core/Codec.h index 88ea00de..3e696ce3 100644 --- a/include/quill/core/Codec.h +++ b/include/quill/core/Codec.h @@ -268,11 +268,20 @@ template QUILL_NODISCARD QUILL_ATTRIBUTE_HOT size_t compute_encoded_size_and_cache_string_lengths( QUILL_MAYBE_UNUSED detail::SizeCacheVector& conditional_arg_size_cache, Args const&... args) noexcept { - // we always need to clear the cache first before calling this function - conditional_arg_size_cache.clear(); + if constexpr (!std::conjunction_v>, std::is_enum>, + std::is_same, void const*>, detail::is_std_string>, + std::is_same, std::string_view>>...>) + { + // Clear the cache whenever processing involves non-fundamental types, + // or when the arguments are not of type std::string or std::string_view. + conditional_arg_size_cache.clear(); + } size_t total_sum{0}; - // Do not use fold expression with '+ ...' as we need a guaranteed sequence for the args here + // Avoid using a fold expression with '+ ...' because we require a guaranteed evaluation + // order to ensure that each argument is processed in sequence. This is essential for + // correctly populating the conditional_arg_size_cache ((total_sum += Codec>::compute_encoded_size(conditional_arg_size_cache, args)), ...); return total_sum; }