Operator overloading or alternatives to expression templates

Timon Gehr via Digitalmars-d digitalmars-d at puremagic.com
Mon Sep 14 11:53:00 PDT 2015


On 09/14/2015 08:18 PM, Andrei Alexandrescu wrote:
> On 09/13/2015 01:16 PM, Daniel N wrote:
>> On Sunday, 13 September 2015 at 14:06:46 UTC, Martin Nowak wrote:
>>>   struct Foo
>>>   {
>>>       size_t id;
>>>       int opCmp(Foo rhs)
>>>       {
>>>           if (id < rhs.id) return -1;
>>>           if (id == rhs.id) return 0;
>>>           else return 1;
>>>       }
>>>       bool opBinary(string s:"<")(Foo rhs)
>>>       {
>>>           return id < rhs.id;
>>>       }
>>>   }
>>>
>>>   Sorting a million Foos w/ random ids is 37.5% slower with opCmp.
>>>
>>
>> Could you try this?
>>
>> int opCmp(Foo rhs)
>> {
>>    return (id > rhs.id) - (id < rhs.id);
>> }
>
> Apparently that does well with gcc:
> http://stackoverflow.com/questions/10996418/efficient-integer-compare-function
> -- Andrei
>

The first version was actually slightly faster when I tested it with 
std::sort. (i.e. if only "<" is used). I guess it is optimized to a 
simple integer comparison after inlining. In any case, any performance 
differences for such simple equivalent functions are random quirks of 
the respective back-ends.


More information about the Digitalmars-d mailing list