On Tue, Aug 8, 2023 at 1:14 PM Jonathan Wakely <jwak...@redhat.com> wrote:
>
>
>
> On Tue, 18 Jul 2023 at 07:28, Ken Matsui via Libstdc++ 
> <libstd...@gcc.gnu.org> wrote:
>>
>> I will eventually work on disjunction to somehow optimize, but in the
>> meantime, this might be a better implementation. Of course, my
>> benchmark could be wrong.
>
>
> You should use __or_ internally in libstdc++ code, not std::disjunction.
>
> Patrick already optimized both of those, and __or_ is slightly faster 
> (because it doesn't have to conform to the full requirements of 
> std::disjunction).
>
I will! Thank you!

> A compiler built-in for __or_ / __disjunction might perform better. But 
> eventually if we're going to have built-ins for all of __is_arithmetic, 
> __is_void, and __is_null_pointer, then we would want simply:
>
> __is_arithmetic(T) || __is_void(T) || __is_null_pointer(T)
>
> and so we wouldn't need to avoid instantiating any class templates at all.
>
I think we are not going to define built-ins for is_void and
is_null_pointer as their type trait implementations are already
optimal.

>
>>
>>
>> On Mon, Jul 17, 2023 at 11:24 PM Ken Matsui <kmat...@cs.washington.edu> 
>> wrote:
>> >
>> > Hi,
>> >
>> > I took a benchmark for this.
>> >
>> > https://github.com/ken-matsui/gcc-benches/blob/main/is_fundamental-disjunction.md#mon-jul-17-105937-pm-pdt-2023
>> >
>> > template<typename _Tp>
>> > struct is_fundamental
>> > : public std::bool_constant<__is_arithmetic(_Tp)
>> >                             || std::is_void<_Tp>::value
>> >                             || std::is_null_pointer<_Tp>::value>
>> > { };
>> >
>> > is faster than:
>> >
>> > template<typename _Tp>
>> > struct is_fundamental
>> > : public std::bool_constant<__is_arithmetic(_Tp)
>> >                             || std::disjunction<std::is_void<_Tp>,
>> >                                                 std::is_null_pointer<_Tp>
>> >                                                 >::value>
>> > { };
>> >
>> > Time: -32.2871%
>> > Peak Memory: -18.5071%
>> > Total Memory: -20.1991%
>> >
>> > Sincerely,
>> > Ken Matsui
>> >
>> > On Sun, Jul 16, 2023 at 9:49 PM Ken Matsui <kmat...@cs.washington.edu> 
>> > wrote:
>> > >
>> > > On Sun, Jul 16, 2023 at 5:41 AM François Dumont <frs.dum...@gmail.com> 
>> > > wrote:
>> > > >
>> > > >
>> > > > On 15/07/2023 06:55, Ken Matsui via Libstdc++ wrote:
>> > > > > This patch optimizes the performance of the is_fundamental trait by
>> > > > > dispatching to the new __is_arithmetic built-in trait.
>> > > > >
>> > > > > libstdc++-v3/ChangeLog:
>> > > > >
>> > > > >       * include/std/type_traits (is_fundamental_v): Use 
>> > > > > __is_arithmetic
>> > > > >       built-in trait.
>> > > > >       (is_fundamental): Likewise. Optimize the original 
>> > > > > implementation.
>> > > > >
>> > > > > Signed-off-by: Ken Matsui <kmat...@gcc.gnu.org>
>> > > > > ---
>> > > > >   libstdc++-v3/include/std/type_traits | 21 +++++++++++++++++----
>> > > > >   1 file changed, 17 insertions(+), 4 deletions(-)
>> > > > >
>> > > > > diff --git a/libstdc++-v3/include/std/type_traits 
>> > > > > b/libstdc++-v3/include/std/type_traits
>> > > > > index 7ebbe04c77b..cf24de2fcac 100644
>> > > > > --- a/libstdc++-v3/include/std/type_traits
>> > > > > +++ b/libstdc++-v3/include/std/type_traits
>> > > > > @@ -668,11 +668,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> > > > >   #endif
>> > > > >
>> > > > >     /// is_fundamental
>> > > > > +#if __has_builtin(__is_arithmetic)
>> > > > > +  template<typename _Tp>
>> > > > > +    struct is_fundamental
>> > > > > +    : public __bool_constant<__is_arithmetic(_Tp)
>> > > > > +                             || is_void<_Tp>::value
>> > > > > +                             || is_null_pointer<_Tp>::value>
>> > > > > +    { };
>> > > >
>> > > > What about doing this ?
>> > > >
>> > > >    template<typename _Tp>
>> > > >      struct is_fundamental
>> > > >      : public __bool_constant<__is_arithmetic(_Tp)
>> > > >                               || __or_<is_void<_Tp>,
>> > > >                                       is_null_pointer<_Tp>>::value>
>> > > >      { };
>> > > >
>> > > > Based on your benches it seems that builtin __is_arithmetic is much 
>> > > > better that std::is_arithmetic. But __or_ could still avoid 
>> > > > instantiation of is_null_pointer.
>> > > >
>> > > Let me take a benchmark for this later.
>>

Reply via email to