Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #82895 > unrolled thread

C++20 concepts rocks

Started byBonita Montero <Bonita.Montero@gmail.com>
First post2022-02-04 13:54 +0100
Last post2022-02-07 18:30 +0100
Articles 3 on this page of 103 — 18 participants

Back to article view | Back to comp.lang.c++


Contents

  C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-04 13:54 +0100
    Re: C++20 concepts rocks Muttley@dastardlyhq.com - 2022-02-04 14:25 +0000
      Re: C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-04 15:31 +0100
        Re: C++20 concepts rocks Muttley@dastardlyhq.com - 2022-02-04 14:54 +0000
          Re: C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-04 17:41 +0100
            Re: C++20 concepts rocks Muttley@dastardlyhq.com - 2022-02-05 11:31 +0000
              Re: C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-05 12:49 +0100
                Re: C++20 concepts rocks Muttley@dastardlyhq.com - 2022-02-05 12:20 +0000
        Re: C++20 concepts rocks Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-02-04 16:15 +0000
          Re: C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-04 17:43 +0100
          Re: C++20 concepts rocks "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-02-05 01:51 +0100
            Re: C++20 concepts rocks Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-02-05 01:59 +0000
            Re: C++20 concepts rocks James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-02-04 23:05 -0500
              Re: C++20 concepts rocks "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-02-05 11:56 +0100
                Re: C++20 concepts rocks David Brown <david.brown@hesbynett.no> - 2022-02-05 13:53 +0100
                  Re: C++20 concepts rocks "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-02-05 14:12 +0100
                  Re: C++20 concepts rocks Anand Hariharan <mailto.anand.hariharan@gmail.com> - 2022-02-12 11:13 -0800
                    Re: C++20 concepts rocks James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-02-12 22:18 -0500
                      Re: C++20 concepts rocks Richard Damon <Richard@Damon-Family.org> - 2022-02-13 12:51 -0500
                      Re: C++20 concepts rocks Paavo Helde <eesnimi@osa.pri.ee> - 2022-02-13 20:16 +0200
                        Re: C++20 concepts rocks James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-02-13 14:12 -0500
                          Re: C++20 concepts rocks Richard Damon <Richard@Damon-Family.org> - 2022-02-13 16:22 -0500
                            Re: C++20 concepts rocks James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-02-13 17:18 -0500
                            Re: C++20 concepts rocks Öö Tiib <ootiib@hot.ee> - 2022-02-14 00:51 -0800
                              Re: C++20 concepts rocks "james...@alumni.caltech.edu" <jameskuyper@alumni.caltech.edu> - 2022-02-14 08:29 -0800
            Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-04 23:37 -0800
              Re: C++20 concepts rocks "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-02-05 11:58 +0100
                Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-06 02:16 -0800
              Re: C++20 concepts rocks "james...@alumni.caltech.edu" <jameskuyper@alumni.caltech.edu> - 2022-02-05 12:35 -0800
                Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-06 05:54 -0800
                Re: C++20 concepts rocks Manfred <noname@add.invalid> - 2022-02-06 19:43 +0100
          Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-04 23:53 -0800
            Re: C++20 concepts rocks red floyd <no.spam.here@its.invalid> - 2022-02-05 10:10 -0800
              Re: C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-05 19:51 +0100
                Re: C++20 concepts rocks red floyd <no.spam.here@its.invalid> - 2022-02-05 16:42 -0800
                  Re: C++20 concepts rocks Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-02-06 01:39 +0000
                    Re: C++20 concepts rocks red floyd <no.spam.here@its.invalid> - 2022-02-05 18:02 -0800
                  Re: C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-06 09:57 +0100
                    Re: C++20 concepts rocks "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-02-06 10:57 +0100
                      Re: C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-06 12:40 +0100
                      Re: C++20 concepts rocks Öö Tiib <ootiib@hot.ee> - 2022-02-06 03:53 -0800
                      Re: C++20 concepts rocks Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-02-06 14:35 +0000
                        Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-06 11:20 -0800
                          Re: C++20 concepts rocks Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-02-06 21:53 +0000
                            Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-06 19:03 -0800
                              Re: C++20 concepts rocks Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-02-07 11:50 +0000
                                Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-07 06:26 -0800
                                  Re: C++20 concepts rocks Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-02-07 15:48 +0000
                                    Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-07 12:16 -0800
                                      Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-07 22:27 -0800
                                      Re: C++20 concepts rocks Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-02-09 21:43 +0000
                                        Re: C++20 concepts rocks James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-02-09 21:07 -0500
                                        Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-09 21:25 -0800
                                          Re: C++20 concepts rocks Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-02-10 13:05 +0000
                                            Re: C++20 concepts rocks James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-02-10 11:19 -0500
                                            Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-11 05:41 -0800
                                              Re: C++20 concepts rocks "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-02-11 17:06 +0100
                                                Re: C++20 concepts rocks James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-02-11 11:50 -0500
                                                  Re: C++20 concepts rocks "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-02-11 21:13 +0100
                                                Re: C++20 concepts rocks scott@slp53.sl.home (Scott Lurndal) - 2022-02-11 17:06 +0000
                                                Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-15 00:10 -0800
                                                  Re: C++20 concepts rocks "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-02-15 20:58 +0100
                                                    Re: C++20 concepts rocks Juha Nieminen <nospam@thanks.invalid> - 2022-02-16 06:40 +0000
                                                      Re: C++20 concepts rocks "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-02-16 09:54 +0100
                                                        Re: C++20 concepts rocks Muttley@dastardlyhq.com - 2022-02-16 09:00 +0000
                                                          Re: C++20 concepts rocks "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-02-16 20:25 +0100
                                                            Re: C++20 concepts rocks Muttley@dastardlyhq.com - 2022-02-17 08:53 +0000
                                                              Re: C++20 concepts rocks Paavo Helde <eesnimi@osa.pri.ee> - 2022-02-17 16:11 +0200
                                                              Re: C++20 concepts rocks James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-02-17 10:58 -0500
                                                          Re: C++20 concepts rocks Juha Nieminen <nospam@thanks.invalid> - 2022-02-17 07:32 +0000
                                                    Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-04-19 02:21 -0700
                                                      Re: C++20 concepts rocks "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-04-19 11:56 +0200
                                                        Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-04-25 03:02 -0700
                                              Re: C++20 concepts rocks Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-02-12 00:01 +0000
                                                Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-14 23:55 -0800
                            Re: C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-07 18:31 +0100
                              Re: C++20 concepts rocks scott@slp53.sl.home (Scott Lurndal) - 2022-02-07 17:43 +0000
                        Re: C++20 concepts rocks James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-02-06 14:25 -0500
                    Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-06 02:01 -0800
                    Re: C++20 concepts rocks red floyd <no.spam.here@its.invalid> - 2022-02-06 19:37 -0800
                      Re: C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-07 10:18 +0100
                      Re: C++20 concepts rocks Paavo Helde <eesnimi@osa.pri.ee> - 2022-02-07 11:32 +0200
                        Re: C++20 concepts rocks red floyd <no.spam.here@its.invalid> - 2022-02-07 07:55 -0800
              Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-06 02:11 -0800
                Re: C++20 concepts rocks "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-02-06 13:13 +0100
                  Re: C++20 concepts rocks Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-06 04:58 -0800
                    Re: C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-06 14:08 +0100
          Re: C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-05 12:48 +0100
      Re: C++20 concepts rocks Juha Nieminen <nospam@thanks.invalid> - 2022-02-04 20:15 +0000
        Re: C++20 concepts rocks Muttley@dastardlyhq.com - 2022-02-05 11:32 +0000
          Re: C++20 concepts rocks Juha Nieminen <nospam@thanks.invalid> - 2022-02-06 08:28 +0000
            Re: C++20 concepts rocks Muttley@dastardlyhq.com - 2022-02-07 09:52 +0000
              Re: C++20 concepts rocks Juha Nieminen <nospam@thanks.invalid> - 2022-02-08 07:05 +0000
                Re: C++20 concepts rocks Muttley@dastardlyhq.com - 2022-02-08 09:25 +0000
                  Re: C++20 concepts rocks Juha Nieminen <nospam@thanks.invalid> - 2022-02-08 10:09 +0000
    Re: C++20 concepts rocks Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-02-04 12:10 -0800
      Re: C++20 concepts rocks Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-05 13:41 +0100
        Re: C++20 concepts rocks "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2022-02-05 19:28 -0800
    A little benchmark: Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-05 13:22 +0100
      A better benchmark Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-06 14:56 +0100
        A improved routine Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-07 15:19 +0100
        Re: A better benchmark Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-02-07 06:57 -0800
          Re: A better benchmark Bonita Montero <Bonita.Montero@gmail.com> - 2022-02-07 18:30 +0100

Page 6 of 6 — ← Prev page 1 2 3 4 5 [6]


#82954 — A improved routine

FromBonita Montero <Bonita.Montero@gmail.com>
Date2022-02-07 15:19 +0100
SubjectA improved routine
Message-ID<str9pc$5v8$1@dont-email.me>
In reply to#82939
That's really short and fast:

template<typename char_t>
	requires same_as<char_t, char> || same_as<char_t, wchar_t>
NOINLINE
char_t const *formatClockCyclesMineImpr( uint64_t clockCycles )
{
	using str_arr_t = array<char_t, 20 + (20 - 1) / 3 + 1>;
	using str_arr_it = typename str_arr_t::iterator;
	thread_local str_arr_t str;
	str_arr_it wrt = str.end();
	*--wrt = '\0';
	auto nextDigit = [&]() { *--wrt = '0' + (char)(clockCycles % 10), 
clockCycles /= 10; };
	while( clockCycles >= 1'000 )
		nextDigit(), nextDigit(), nextDigit(),
		*--wrt = '.';
	do
		nextDigit();
	while( clockCycles );
	return &*wrt;
}

[toc] | [prev] | [next] | [standalone]


#82956 — Re: A better benchmark

FromTim Rentsch <tr.17687@z991.linuxsc.com>
Date2022-02-07 06:57 -0800
SubjectRe: A better benchmark
Message-ID<86y22miv1g.fsf@linuxsc.com>
In reply to#82939
Bonita Montero <Bonita.Montero@gmail.com> writes:

[.. some minor editing to fix line-wrapping problems ..]

> Now I have an even distribution from 1 to 20 digits.
>
> #include <iostream>
> #include <concepts>
> #include <array>
> #include <cstdio>
> #include <cstring>
> #include <chrono>
> #include <vector>
> #include <random>
>
> using namespace std;
> using namespace chrono;
>
> #if defined(_MSC_VER)
>     #pragma warning(disable : 4996) // disable deprecated sprintf
>     #pragma warning(disable : 6200) // array out of range
> #endif
>
> template<typename char_t>
>     requires same_as<char_t, char> || same_as<char_t, wchar_t>
> char_t const *formatClockCyclesMine( uint64_t clockCycles );
> char const *formatClockCyclesTim( uint64_t clockCycles );
> char const *formatClockCyclesBen( uint64_t clockCycles );
>
> int main()
> {
>     auto bench = []<typename FccFn>( FccFn fn )
>         requires
>             requires( FccFn fn, uint64_t clockCycles ) {
>                 { *fn( clockCycles ) } -> convertible_to<char>;
              }
>     {
>         static size_t const N_VALUES = 10'000, N = 1'000;
>         vector<uint64_t> values( N_VALUES );
>         mt19937_64 mt;
>         uniform_int_distribution<size_t> uidLength( 1, 20 );
>         uniform_int_distribution<unsigned> uidDigit( 0, 9 );
>         auto getNumber = [&]() -> uint64_t
>         {
>             uint64_t number = 0, nextNumber;
>             size_t initialLength = uidLength( mt ), length = initialLength;
>             unsigned digit;
>             do
>                 if( 
>                     (nextNumber = number * 10 + (digit = uidDigit( mt )))
>                         >= number
>                 )
>                     number = nextNumber;
>                 else
>                     number = 0,
>                     length = initialLength + 1;
>             while( --length );
>             return number;
>         };
>         for( uint64_t &v : values )
>             v = getNumber();
>         char volatile sum = 0;
>         auto start = high_resolution_clock::now();
>         for( size_t n = N; n--; )
>             for( uint64_t v : values )
>                 sum += *fn( v );
>         return
>             (double)(int64_t)duration_cast<nanoseconds>(
>                  high_resolution_clock::now() - start
>              ).count() / ((double)N * (double)N_VALUES);
>     };
>     cout << "mine: " << bench( formatClockCyclesMine<char> ) << endl;
>     cout << "Tim:  " << bench( formatClockCyclesTim ) << endl;
>     cout << "Ben:  " << bench( formatClockCyclesBen ) << endl;
> }
>
> #if defined(_MSC_VER)
>     #define NOINLINE __declspec(noinline)
> #elif defined(__GNUC__) || defined(__llvm__)
>     #define NOINLINE __attribute__((noinline))
> #elif
>     #define NOINLINE
> #endif
>
> template<typename char_t>
>     requires same_as<char_t, char> || same_as<char_t, wchar_t>
> NOINLINE
> char_t const *formatClockCyclesMine( uint64_t clockCycles )
> {
>     using dig_arr_t = array<uint8_t, 20>; // max 20 digits for 64 bit
>     using dig_arr_it = typename dig_arr_t::iterator;
>     dig_arr_t reverseDigits;
>     dig_arr_it rDigitsEnd = reverseDigits.begin();
>     do
>         *rDigitsEnd++ = clockCycles % 10,
>         clockCycles /= 10;
>     while( clockCycles );
>     size_t
>         digitsLen = rDigitsEnd - reverseDigits.begin(),
>         groups = (digitsLen - 1) / 3;
>     using str_arr_t = array<char_t, 20 + (20 - 1) / 3 + 1>;
>     using str_arr_it = typename str_arr_t::iterator;
>     thread_local str_arr_t str;
>     str_arr_it wrt = str.begin() + digitsLen + groups;
>     *wrt = '\0';
>     dig_arr_it digit = reverseDigits.begin();
>     for(
>         dig_arr_it groupsEnd = reverseDigits.begin() + groups * 3;
>         digit != groupsEnd;
>         wrt -= 4, digit += 3
>      )
>         wrt[-1] = digit[0] + '0',
>         wrt[-2] = digit[1] + '0',
>         wrt[-3] = digit[2] + '0',
>         wrt[-4] = '.';
>     do
>         *--wrt = *digit++ + '0';
>     while( digit != rDigitsEnd );
>     return &*wrt;
> }
>
> NOINLINE
> char const *formatClockCyclesTim( uint64_t clockCycles )
> {
>     thread_local char result[20 + (20 - 1) / 3 + 1];
>     size_t n =
>         (unsigned)sprintf( result, "%llu",
>             (unsigned long long) clockCycles );
>     char *ep = (&result)[1];
>     *--ep = 0;
>     while( n > 3 )
>         memmove( ep -= 3, &result[n -= 3], 3 ),
>         *--ep = '.';
>     do
>         *--ep = result[--n];
>     while( n );
>     return ep;
> }
>
> NOINLINE
> char const *formatClockCyclesBen( uint64_t clockCycles )
> {
>     thread_local char result[20 + (20 - 1) / 3 + 1];
>     char *ep = (&result)[1];
>     do
>     {
>         // initially with a missing cast, actually would have
>         // run only on little endian machines
>         sprintf( ep - 4, "%03lu", (unsigned long)(clockCycles % 1000) );
>         if( ep != (&result)[1] )
>             ep[-1] = '.';
>         ep -= 4;
>     } while( clockCycles /= 1000 );
>     for( ; *ep == '0' && ep[1]; ++ep );
>     return ep;
> }
>
> These are the resuls:
>
> MSVC 2022:
>     mine: 29.8306
>     Tim:  109.97
>     Ben:  320.64
>
> g++ 11.1.0:
>     mine: 28.3386
>     Tim:  110.586
>     Ben:  317.135
>
> clang++ 10.0.0:
>     mine: 29.7089
>     Tim:  100.721
>     Ben:  311.768

The code that I posted was meant only to show an improvement on
the code in the posting to which I was responding.  It wasn't
meant as any kind of comparison with any code you posted earlier.

After seeing the posting above, it wasn't hard to write a
simple routine that is both shorter and faster than the
formatClockCyclesMine() function shown above (using the code
shown above in main() to do the performance testing).

[toc] | [prev] | [next] | [standalone]


#82959 — Re: A better benchmark

FromBonita Montero <Bonita.Montero@gmail.com>
Date2022-02-07 18:30 +0100
SubjectRe: A better benchmark
Message-ID<strkv2$th7$1@dont-email.me>
In reply to#82956
Am 07.02.2022 um 15:57 schrieb Tim Rentsch:
> Bonita Montero <Bonita.Montero@gmail.com> writes:
> 
> [.. some minor editing to fix line-wrapping problems ..]
> 
>> Now I have an even distribution from 1 to 20 digits.
>>
>> #include <iostream>
>> #include <concepts>
>> #include <array>
>> #include <cstdio>
>> #include <cstring>
>> #include <chrono>
>> #include <vector>
>> #include <random>
>>
>> using namespace std;
>> using namespace chrono;
>>
>> #if defined(_MSC_VER)
>>      #pragma warning(disable : 4996) // disable deprecated sprintf
>>      #pragma warning(disable : 6200) // array out of range
>> #endif
>>
>> template<typename char_t>
>>      requires same_as<char_t, char> || same_as<char_t, wchar_t>
>> char_t const *formatClockCyclesMine( uint64_t clockCycles );
>> char const *formatClockCyclesTim( uint64_t clockCycles );
>> char const *formatClockCyclesBen( uint64_t clockCycles );
>>
>> int main()
>> {
>>      auto bench = []<typename FccFn>( FccFn fn )
>>          requires
>>              requires( FccFn fn, uint64_t clockCycles ) {
>>                  { *fn( clockCycles ) } -> convertible_to<char>;
>                }
>>      {
>>          static size_t const N_VALUES = 10'000, N = 1'000;
>>          vector<uint64_t> values( N_VALUES );
>>          mt19937_64 mt;
>>          uniform_int_distribution<size_t> uidLength( 1, 20 );
>>          uniform_int_distribution<unsigned> uidDigit( 0, 9 );
>>          auto getNumber = [&]() -> uint64_t
>>          {
>>              uint64_t number = 0, nextNumber;
>>              size_t initialLength = uidLength( mt ), length = initialLength;
>>              unsigned digit;
>>              do
>>                  if(
>>                      (nextNumber = number * 10 + (digit = uidDigit( mt )))
>>                          >= number
>>                  )
>>                      number = nextNumber;
>>                  else
>>                      number = 0,
>>                      length = initialLength + 1;
>>              while( --length );
>>              return number;
>>          };
>>          for( uint64_t &v : values )
>>              v = getNumber();
>>          char volatile sum = 0;
>>          auto start = high_resolution_clock::now();
>>          for( size_t n = N; n--; )
>>              for( uint64_t v : values )
>>                  sum += *fn( v );
>>          return
>>              (double)(int64_t)duration_cast<nanoseconds>(
>>                   high_resolution_clock::now() - start
>>               ).count() / ((double)N * (double)N_VALUES);
>>      };
>>      cout << "mine: " << bench( formatClockCyclesMine<char> ) << endl;
>>      cout << "Tim:  " << bench( formatClockCyclesTim ) << endl;
>>      cout << "Ben:  " << bench( formatClockCyclesBen ) << endl;
>> }
>>
>> #if defined(_MSC_VER)
>>      #define NOINLINE __declspec(noinline)
>> #elif defined(__GNUC__) || defined(__llvm__)
>>      #define NOINLINE __attribute__((noinline))
>> #elif
>>      #define NOINLINE
>> #endif
>>
>> template<typename char_t>
>>      requires same_as<char_t, char> || same_as<char_t, wchar_t>
>> NOINLINE
>> char_t const *formatClockCyclesMine( uint64_t clockCycles )
>> {
>>      using dig_arr_t = array<uint8_t, 20>; // max 20 digits for 64 bit
>>      using dig_arr_it = typename dig_arr_t::iterator;
>>      dig_arr_t reverseDigits;
>>      dig_arr_it rDigitsEnd = reverseDigits.begin();
>>      do
>>          *rDigitsEnd++ = clockCycles % 10,
>>          clockCycles /= 10;
>>      while( clockCycles );
>>      size_t
>>          digitsLen = rDigitsEnd - reverseDigits.begin(),
>>          groups = (digitsLen - 1) / 3;
>>      using str_arr_t = array<char_t, 20 + (20 - 1) / 3 + 1>;
>>      using str_arr_it = typename str_arr_t::iterator;
>>      thread_local str_arr_t str;
>>      str_arr_it wrt = str.begin() + digitsLen + groups;
>>      *wrt = '\0';
>>      dig_arr_it digit = reverseDigits.begin();
>>      for(
>>          dig_arr_it groupsEnd = reverseDigits.begin() + groups * 3;
>>          digit != groupsEnd;
>>          wrt -= 4, digit += 3
>>       )
>>          wrt[-1] = digit[0] + '0',
>>          wrt[-2] = digit[1] + '0',
>>          wrt[-3] = digit[2] + '0',
>>          wrt[-4] = '.';
>>      do
>>          *--wrt = *digit++ + '0';
>>      while( digit != rDigitsEnd );
>>      return &*wrt;
>> }
>>
>> NOINLINE
>> char const *formatClockCyclesTim( uint64_t clockCycles )
>> {
>>      thread_local char result[20 + (20 - 1) / 3 + 1];
>>      size_t n =
>>          (unsigned)sprintf( result, "%llu",
>>              (unsigned long long) clockCycles );
>>      char *ep = (&result)[1];
>>      *--ep = 0;
>>      while( n > 3 )
>>          memmove( ep -= 3, &result[n -= 3], 3 ),
>>          *--ep = '.';
>>      do
>>          *--ep = result[--n];
>>      while( n );
>>      return ep;
>> }
>>
>> NOINLINE
>> char const *formatClockCyclesBen( uint64_t clockCycles )
>> {
>>      thread_local char result[20 + (20 - 1) / 3 + 1];
>>      char *ep = (&result)[1];
>>      do
>>      {
>>          // initially with a missing cast, actually would have
>>          // run only on little endian machines
>>          sprintf( ep - 4, "%03lu", (unsigned long)(clockCycles % 1000) );
>>          if( ep != (&result)[1] )
>>              ep[-1] = '.';
>>          ep -= 4;
>>      } while( clockCycles /= 1000 );
>>      for( ; *ep == '0' && ep[1]; ++ep );
>>      return ep;
>> }
>>
>> These are the resuls:
>>
>> MSVC 2022:
>>      mine: 29.8306
>>      Tim:  109.97
>>      Ben:  320.64
>>
>> g++ 11.1.0:
>>      mine: 28.3386
>>      Tim:  110.586
>>      Ben:  317.135
>>
>> clang++ 10.0.0:
>>      mine: 29.7089
>>      Tim:  100.721
>>      Ben:  311.768
> 
> The code that I posted was meant only to show an improvement on
> the code in the posting to which I was responding.  It wasn't
> meant as any kind of comparison with any code you posted earlier.

The "better" benchmark doesn't include a different formatClockCycles
-algorithm than I've shown before.

> After seeing the posting above, it wasn't hard to write a
> simple routine that is both shorter and faster than the
> formatClockCyclesMine() function shown above (using the code
> shown above in main() to do the performance testing).

I think the last version I've shown couldn't be faster;
and thanks to lambdas even not shorter and faster.

[toc] | [prev] | [standalone]


Page 6 of 6 — ← Prev page 1 2 3 4 5 [6]

Back to top | Article view | comp.lang.c++


csiph-web