GC allocation

Alex via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Apr 22 00:00:24 PDT 2016


On Friday, 22 April 2016 at 01:55:36 UTC, Adam D. Ruppe wrote:
> On Thursday, 21 April 2016 at 22:59:58 UTC, Alex wrote:
>> Ok... I make slices of them, carefully avoiding to make 
>> copies...
>
> Yeah, that shouldn't make a difference..

Wait, wait... I try to make slices of the array of delegates, 
because I thought the slicing operation is cheaper, then another 
possibilities... And I try to make them as little as possible.

>
>> Huh? I think, this is the place, where I lack some 
>> background... So, I bind my delegates via
>
> Can you post any more of your code?

Sure. Which part? ;)
the delegate is defined directly in a model as
uint dDelegate(uint id, MM p);

and the method delegateDefinition inside the binding responsible 
class has a form like
uint delegateDefinition(uint id, MM p)
{
     uint retVal;
     final switch(p) with(MM)
     {
         case first: return callSomeFuncFromThisObject(id); break;
         case second: return id; break; // this the one and only 
case, which is unusual
         case third: return 
knownObjectByThisObject.callAnotherFunc(id); break;
     }
}

And a slice returning method inside the responsible class has a 
form like
typeof(.delegates) getSlice(uint i)
{
     uint first = someLogic(i);
     uint last = someOtherLogic(i);
     return .delegates[first .. last];
}

Indeed, the getSlice operation is the slowest, because of the 
getting the first and the last operations. So I reduce the calls 
to slice returning methods to this one and only method. And I 
call it as rare as possible.
But I hope the slicing itself does not copy anything which is 
seen anyway by every other object. The getSlice method should 
just return the proper, well, slice, based on the given input.

>
>>     return iota(delegatesAmount).map!(a => (MM p) => 
>> .dDelegate(a, p));
>
> This would indeed allocate a new heap block for each one, but 
> there might be other ways to do it.
>
>> Yes. I'm sure the object is alive till the very end. As 
>> mentioned above, do you think it is worth to make a struct to 
>> save a result from iota?
>> Nevertheless, my intention here is speed, so a fast solution 
>> is much better, then any slow one, even if the speed gain is 
>> 10% only... But the construction effort is almost negligible.
>
> I don't know yet, if construction is allowed to be slower, what 
> you have is fine though.

Cool :)
Thanks!


More information about the Digitalmars-d-learn mailing list