LRU cache for ~=
Chris Nicholson-Sauls
ibisbasenji at gmail.com
Mon Oct 19 13:16:25 PDT 2009
Andrei Alexandrescu wrote:
> I just wrote this to Sean and Walter and subsequently discussed it with
> Walter. Walter thinks this should work. Does anyone have the time and
> inclination to test this out? It would involve hacking into druntime's
> implementation of ~= (I'm not sure what the function name is). I'd
> really appreciate this; I'm overloaded as it is.
>
> ==================
>
> In wake of the recent demise of T[new], I was thinking of finding ways
> of making ~= efficient for T[].
>
> Currently ~= is slow because accessing GC.sizeOf(void*) acquires a
> global lock and generally must figure out a lot of things about the
> pointer to make a decision.
>
> Also, ~= is dangerous because it allows slices to stomp over other slices.
>
> I was thinking of solving these issues by keeping an LRU (Least Recently
> Used) cache inside the implementation of ~=. The LRU would only have a
> few entries (4-8) and would store the parameters of the last ~= calls,
> and their cached capacities.
>
> So whenever code calls arr ~= b, the LRU is searched first. If the
> system finds "arr" (both bounds) in the LRU, that means the cached
> capacity is correct and can solve the matter without an actual trip to
> the GC at all! Otherwise, do the deed and cache the new slice and the
> new capacity.
>
> This also solves the lack of safety: if you request a growth on an array
> you just grew, it's impossible to have a valid slice beyond that array.
>
> This LRU would allow us to keep the slice API as it currently is, and
> also at excellent efficiency.
>
> What do you think?
>
>
> Andrei
Its an interesting idea, and if I have time tonight I'll take a crack at it. For those
others who may, the function you care about is "_d_arrayappendcT" in compiler/dmd/lifetime.
-- Chris Nicholson-Sauls
More information about the Digitalmars-d
mailing list