]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Optimize std::bitset<N>::to_string
authorJonathan Wakely <jwakely@redhat.com>
Thu, 22 Sep 2022 17:36:04 +0000 (18:36 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 28 Mar 2023 22:18:27 +0000 (23:18 +0100)
This makes to_string approximately twice as fast at any optimization
level. Instead of iterating through every bit, jump straight to the next
bit that is set, by using _Find_first and _Find_next.

libstdc++-v3/ChangeLog:

* include/std/bitset (bitset::_M_copy_to_string): Find set bits
instead of iterating over individual bits.

(cherry picked from commit ffb03fa12850df3a4f53435d5f20ff122c83732a)

libstdc++-v3/include/std/bitset

index 438c2f7efe9281c4dec5a9e37960be569da12045..8ff9d7fdefdbaf0ea3967f49b54f305bf0e7d2ce 100644 (file)
@@ -1415,9 +1415,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
                        _CharT __zero, _CharT __one) const
       {
        __s.assign(_Nb, __zero);
-       for (size_t __i = _Nb; __i > 0; --__i)
-         if (_Unchecked_test(__i - 1))
-           _Traits::assign(__s[_Nb - __i], __one);
+       size_t __n = this->_Find_first();
+       while (__n < _Nb)
+         {
+           __s[_Nb - __n - 1] = __one;
+           __n = _Find_next(__n);
+         }
       }
 
   // 23.3.5.3 bitset operations: