From 7e4bc94510bda8e027e5dd0cce9da8c1e33e9530 Mon Sep 17 00:00:00 2001 From: Roman-Koshelev <34384083+Roman-Koshelev@users.noreply.github.com> Date: Sat, 9 Oct 2021 15:27:38 +0300 Subject: [PATCH] Speeding up write_significand() (#2499) --- include/fmt/format.h | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/include/fmt/format.h b/include/fmt/format.h index 2bd5a26c..c34f505b 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -1713,14 +1713,20 @@ inline auto write_significand(Char* out, UInt significand, int significand_size, int integral_size, Char decimal_point) -> Char* { if (!decimal_point) return format_decimal(out, significand, significand_size).end; - auto end = format_decimal(out + 1, significand, significand_size).end; - if (integral_size == 1) { - out[0] = out[1]; - } else { - std::uninitialized_copy_n(out + 1, integral_size, - make_checked(out, to_unsigned(integral_size))); + out += significand_size + 1; + Char* end = out; + int floating_size = significand_size - integral_size; + for(int i = floating_size / 2; i > 0; --i) { + out -= 2; + copy2(out, digits2(significand % 100)); + significand /= 100; } - out[integral_size] = decimal_point; + if (floating_size % 2 != 0) { + *--out = static_cast('0' + significand % 10); + significand /= 10; + } + *--out = decimal_point; + format_decimal(out - integral_size, significand, integral_size); return end; }