On Mon, 29 Jul 2024 at 10:45, Jonathan Wakely <jwakely....@gmail.com> wrote: > > On Mon, 29 Jul 2024 at 09:42, Ehrnsperger, Markus > <markus_ehrnsper...@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. > > > > > > 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 > > > > > >