Performance improvement for std::to_chars(char* first, char* last, /* integer-type */ value, int base = 10 );

Markus Ehrnsperger markus_ehrnsperger@yahoo.de
Sat Sep 28 06:41:32 GMT 2024


Any update?


Thanks and Regards, Markus



Am 30.07.24 um 09:56 schrieb Jonathan Wakely:
>
>
> On Tue, 30 Jul 2024, 06:21 Ehrnsperger, Markus, 
> <markus_ehrnsperger@yahoo.de> wrote:
>
>     On 2024-07-29 12:16, Jonathan Wakely wrote:
>
>     > On Mon, 29 Jul 2024 at 10:45, Jonathan Wakely
>     <jwakely.gcc@gmail.com> wrote:
>     >> On Mon, 29 Jul 2024 at 09:42, Ehrnsperger, Markus
>     >> <markus_ehrnsperger@yahoo.de> wrote:
>     >>> Hi,
>     >>>
>     >>>
>     >>> I'm attaching two files:
>     >>>
>     >>> 1.:   to_chars10.h:
>     >>>
>     >>> This is intended to be included in libstdc++ / gcc to achieve
>     performance improvements. It is an implementation of
>     >>>
>     >>> to_chars10(char* first, char* last,  /* integer-type */ value);
>     >>>
>     >>> Parameters are identical to std::to_chars(char* first, char*
>     last,  /* integer-type */ value, int base = 10 ); . It only works
>     for base == 10.
>     >>>
>     >>> If it is included in libstdc++, to_chars10(...) could be
>     renamed to std::to_chars(char* first, char* last,  /* integer-type
>     */ value) to provide an overload for the default base = 10
>     >> Thanks for the email. This isn't in the form of a patch that we can
>     >> accept as-is, although I see that the license is compatible with
>     >> libstdc++, so if you are looking to contribute it then that
>     could be
>     >> done either by assigning copyright to the FSF or under the DCO
>     terms.
>     >> See https://gcc.gnu.org/contribute.html#legal for more details.
>     >>
>     >> I haven't looked at the code in detail, but is it a similar
>     approach
>     >> to https://jk-jeon.github.io/posts/2022/02/jeaiii-algorithm/ ?
>     >> How does it compare to the performance of that algorithm?
>     >>
>     >> I have an incomplete implementation of that algorithm for libstdc++
>     >> somewhere, but I haven't looked at it for a while.
>     > I took a closer look and the reinterpret_casts worried me, so I
>     tried
>     > your test code with UBsan. There are a number of errors that would
>     > need to be fixed before we would consider using this code.
>
>     Attached are new versions of to_chars10.cpp, to_chars10.h and the new
>     file itoa_better_y.h
>
>
> Thanks! I'll take another look.
>
>
>
>     Changes:
>
>     - I removed all reinterpret_casts, and tested with
>     -fsanitize=undefined
>
>     - I added itoa_better_y.h from
>     https://jk-jeon.github.io/posts/2022/02/jeaiii-algorithm/ to the
>     performance test.
>
>     Note: There is only one line in the benchmark test
>     for itoa_better_y due
>     to limited features of itoa_better_y:
>
>     Benchmarking random unsigned 32 bit  itoa_better_y   ...
>
>
>     to_chars10.h: Signed-off-by: Markus Ehrnsperger
>     <Markus_Ehrnsperger@yahoo.de>
>
>     The other files are only for performance tests.
>
>     >
>     >
>     >>
>     >>> 2.:  to_chars10.cpp:
>     >>>
>     >>> This is a test program for to_chars10 verifying the
>     correctness of the results, and measuring the performance. The
>     actual performance improvement is system dependent, so please test
>     on your own system.
>     >>>
>     >>> On my system the performance improvement is about factor two,
>     my results are:
>     >>>
>     >>>
>     >>> Test   int8_t verifying to_chars10 = std::to_chars ... OK
>     >>> Test  uint8_t verifying to_chars10 = std::to_chars ... OK
>     >>> Test  int16_t verifying to_chars10 = std::to_chars ... OK
>     >>> Test uint16_t verifying to_chars10 = std::to_chars ... OK
>     >>> Test  int32_t verifying to_chars10 = std::to_chars ... OK
>     >>> Test uint32_t verifying to_chars10 = std::to_chars ... OK
>     >>> Test  int64_t verifying to_chars10 = std::to_chars ... OK
>     >>> Test uint64_t verifying to_chars10 = std::to_chars ... OK
>     >>>
>     >>> Benchmarking test case               tested method  ...  time
>     (lower is better)
>     >>> Benchmarking random unsigned 64 bit to_chars10     ...  0.00957
>     >>> Benchmarking random unsigned 64 bit std::to_chars  ...  0.01854
>     >>> Benchmarking random   signed 64 bit to_chars10     ...  0.01018
>     >>> Benchmarking random   signed 64 bit std::to_chars  ...  0.02297
>     >>> Benchmarking random unsigned 32 bit to_chars10     ...  0.00620
>     >>> Benchmarking random unsigned 32 bit std::to_chars  ...  0.01275
>     >>> Benchmarking random   signed 32 bit to_chars10     ...  0.00783
>     >>> Benchmarking random   signed 32 bit std::to_chars  ...  0.01606
>     >>> Benchmarking random unsigned 16 bit to_chars10     ...  0.00536
>     >>> Benchmarking random unsigned 16 bit std::to_chars  ...  0.00871
>     >>> Benchmarking random   signed 16 bit to_chars10     ...  0.00664
>     >>> Benchmarking random   signed 16 bit std::to_chars  ...  0.01154
>     >>> Benchmarking random unsigned 08 bit to_chars10     ...  0.00393
>     >>> Benchmarking random unsigned 08 bit std::to_chars  ...  0.00626
>     >>> Benchmarking random   signed 08 bit to_chars10     ...  0.00465
>     >>> Benchmarking random   signed 08 bit std::to_chars  ...  0.01089
>     >>>
>     >>>
>     >>> Thanks, Markus
>     >>>
>     >>>
>     >>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20240928/62fe4969/attachment.htm>


More information about the Libstdc++ mailing list