Performance improvement for std::to_chars(char* first, char* last, /* integer-type */ value, int base = 10 );
Jonathan Wakely
jwakely.gcc@gmail.com
Mon Jul 29 10:16:36 GMT 2024
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.
>
>
> >
> > 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
> >
> >
> >
More information about the Libstdc++
mailing list