Yet another strike against the current AA implementation

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Mon Apr 27 07:05:44 PDT 2009


Steven Schveighoffer wrote:
> On Sun, 26 Apr 2009 21:20:32 -0400, Andrei Alexandrescu 
>> I think, all other things being equal, that opApply tends to be slower 
>> than iterators.
> 
> It depends.  The range must have either inline-able functions, or must 
> NOT call virtual functions.  Otherwise, it could be worse.  there is 
> also the factor that you are using an inner function with opApply, so if 
> you regularly access variables outside the foreach loop, then those add up.
> 
> Observe that in opapply style, you do one delegate call per loop iteration.
> With range style, you do three calls on the range per loop iteration 
> (empty, front, popFront).
> 
> If those range calls call virtual calls or ARE virtual calls, then range 
> loses.  Of course, the difference might be washed if you do lots of 
> accesses to an outer variable in your foreach loop, which require a 
> pointer dereference vs. a stack dereference.
> 
> We should quantify this and see what the actual performance is.

This is a very good point. If a range offers virtual 
empty/popFront/front, then opApply is a faster proposition. This makes 
for a good use case for making opApply the preferred way of iteration, 
if present (if you just do foreach and opApply is present, use it).

Andrei



More information about the Digitalmars-d mailing list