On Tue, 30 Jul 2024, 06:21 Ehrnsperger, Markus, <markus_ehrnsper...@yahoo.de>
wrote:

> On 2024-07-29 12:16, Jonathan Wakely wrote:
>
> > 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.
>
> 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_ehrnsper...@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
> >>>
> >>>
> >>>

Reply via email to