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