Skip to content

Commit

Permalink
Optimise size calculation for fundamental types in compute_encoded_si…
Browse files Browse the repository at this point in the history
…ze_and_cache_string_lengths
  • Loading branch information
odygrd committed Sep 22, 2024
1 parent 195c930 commit f09c351
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 9 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@
attempting to log `std::string s(std::numeric_limits<uint32_t>::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 on the hot path.
- Added support for appending a custom timestamp format to log filenames via `StartCustomTimestampFormat`.
Example usage:
```cpp
Expand Down
28 changes: 20 additions & 8 deletions include/quill/core/Codec.h
Original file line number Diff line number Diff line change
Expand Up @@ -266,15 +266,27 @@ namespace detail
*/
template <typename... Args>
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
QUILL_MAYBE_UNUSED detail::SizeCacheVector& conditional_arg_size_cache,
QUILL_MAYBE_UNUSED Args const&... args) noexcept
{
// we always need to clear the cache first before calling this function
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
((total_sum += Codec<detail::remove_cvref_t<Args>>::compute_encoded_size(conditional_arg_size_cache, args)), ...);
return total_sum;
if constexpr (std::conjunction_v<std::disjunction<std::is_arithmetic<detail::remove_cvref_t<Args>>, std::is_enum<detail::remove_cvref_t<Args>>,
std::is_same<detail::remove_cvref_t<Args>, void const*>>...>)
{
// If all arguments are fundamental types, calculate the total size directly.
return (0ull + ... + sizeof(Args));
}
else
{
// Always clear the cache since we're processing non-fundamental types
conditional_arg_size_cache.clear();

size_t total_sum{0};
// 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<detail::remove_cvref_t<Args>>::compute_encoded_size(conditional_arg_size_cache, args)), ...);
return total_sum;
}
}

/**
Expand Down

0 comments on commit f09c351

Please sign in to comment.