public inbox for libstdc++-cvs@sourceware.org help / color / mirror / Atom feed
From: Patrick Palka <ppalka@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r12-8185] libstdc++: Micro-optimize __from_chars_pow2_base Date: Mon, 18 Apr 2022 21:23:17 +0000 (GMT) [thread overview] Message-ID: <20220418212317.86CD73858D1E@sourceware.org> (raw) https://gcc.gnu.org/g:d210653f3907ac1829fd275d067b2855ea53da24 commit r12-8185-gd210653f3907ac1829fd275d067b2855ea53da24 Author: Patrick Palka <ppalka@redhat.com> Date: Mon Apr 18 17:22:55 2022 -0400 libstdc++: Micro-optimize __from_chars_pow2_base In the first iteration of __from_chars_pow2_base's main loop, we need to remember the value of the leading significant digit for sake of the overflow check at the end (for base > 2). This patch manually unrolls this first iteration so as to not encumber the entire loop with logic that only the first iteration needs. This seems to significantly improve performance: Base Before After (seconds, lower is better) 2 9.36 9.37 8 3.66 2.93 16 2.93 1.91 32 2.39 2.24 libstdc++-v3/ChangeLog: * include/std/charconv (__from_chars_pow2_base): Manually unroll the first iteration of the main loop and simplify accordingly. Diff: --- libstdc++-v3/include/std/charconv | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/libstdc++-v3/include/std/charconv b/libstdc++-v3/include/std/charconv index dda4ec87779..f1ace406017 100644 --- a/libstdc++-v3/include/std/charconv +++ b/libstdc++-v3/include/std/charconv @@ -469,25 +469,37 @@ namespace __detail while (__i < __len && __first[__i] == '0') ++__i; const ptrdiff_t __leading_zeroes = __i; + if (__i >= __len) [[__unlikely__]] + { + __first += __i; + return true; + } + // Remember the leading significant digit value if necessary. unsigned char __leading_c = 0; + if (__base != 2) + { + __leading_c = __from_chars_alnum_to_val<_DecOnly>(__first[__i]); + // __glibcxx_assert(__leading_c != 0); + if (__leading_c >= __base) [[__unlikely__]] + { + __first += __i; + return true; + } + __val = __leading_c; + ++__i; + } + for (; __i < __len; ++__i) { const unsigned char __c = __from_chars_alnum_to_val<_DecOnly>(__first[__i]); if (__c >= __base) break; __val = (__val << __log2_base) | __c; - - if (__i == __leading_zeroes) - { - // At the first iteration, remember the leading significant digit. - // __glibcxx_assert(__leading_c == 0 && __c != 0); - __leading_c = __c; - } } __first += __i; auto __significant_bits = (__i - __leading_zeroes) * __log2_base; - if (__base != 2 && __leading_c != 0) + if (__base != 2) // Compensate for a leading significant digit that didn't use all // of its available bits. __significant_bits -= __log2_base - __bit_width(__leading_c);
reply other threads:[~2022-04-18 21:23 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20220418212317.86CD73858D1E@sourceware.org \ --to=ppalka@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ --cc=libstdc++-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).