Minor std::to_chars optimisation for base 10
authorAntony Polukhin <antoshkka@gmail.com>
Mon, 9 Sep 2019 11:12:44 +0000 (11:12 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 9 Sep 2019 11:12:44 +0000 (12:12 +0100)
__to_chars_10_impl is quite fast. According to the IACA the main loop
takes only 6.0 cycles, the whole function with one iteration takes
10.0 cycles. Replacing the __first[pos] and __first[pos - 1] with
__first[0] and __first[1] drops the function time to 7.53 cycles.

2019-09-09  Antony Polukhin  <antoshkka@gmail.com>

* include/bits/charconv.h (__detail::__to_chars_10_impl): Replace
final offsets with constants.

From-SVN: r275514

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/charconv.h

index 0aff148effb20820a981c008367e64c0d8c055f7..6cf1737c7fad440aaf91c7e6139a6a25e9c182a3 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-09  Antony Polukhin  <antoshkka@gmail.com>
+
+       * include/bits/charconv.h (__detail::__to_chars_10_impl): Replace
+       final offsets with constants.
+
 2019-09-09  Jonathan Wakely  <jwakely@redhat.com>
 
        * include/bits/range_access.h (__adl_to_address): Remove.
index 0911660fab6852a61e55f662c4ee5be499e8461b..a5b6be567bcbb5c943afb9678c81c88065418b7c 100644 (file)
@@ -92,11 +92,11 @@ namespace __detail
       if (__val >= 10)
        {
          auto const __num = __val * 2;
-         __first[__pos] = __digits[__num + 1];
-         __first[__pos - 1] = __digits[__num];
+         __first[1] = __digits[__num + 1];
+         __first[0] = __digits[__num];
        }
       else
-       __first[__pos] = '0' + __val;
+       __first[0] = '0' + __val;
     }
 
 } // namespace __detail