LRU cache for ~=
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Mon Oct 19 19:52:06 PDT 2009
grauzone wrote:
> Andrei Alexandrescu wrote:
>> 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.
>
> Sounds like a bad hack, but at least it would solve the issue about
> overwritten slices.
>
> But for some uses of array appending, you had to use a library based
> "Appender" (or whatever you have in Phobos 2):
>
> class Something {
> T[] data;
> void add(T x) {
> data ~= x; //chances that data are in the cache are minimal
> }
> }
>
> There's no "cache locality" or anything, but obviously you still would
> like to have efficient appender behavior.
Why is there no cache locality?
> Also look at this:
>
> string[] t;
> t ~= somefunction();
> t ~= someotherfunction();
>
> Chances are high that those functions will remove "t" from the cache,
> and it would all be inefficient again. Nothing solved!
Why are there chances those functions will remove "t" from the cache?
For it to become a performance problem, there must be a loop with nine
or more round-robin appends. When that does happen, yes, appends will
become slower. (We may be able to make that better by using random
eviction.)
> Now you could try to make the cache function local to solve this issue.
> Whenever a function contains the ~= operator, the compiler allocates a
> "cache" struct, and the ~= operator passes a hidden pointer to it to the
> runtime.
>
> But that wouldn't work if you want pass slices to other functions and to
> append to them (but it would still be safe, I guess?).
>
> Looks like these performance hacks just don't work out.
Caches have a long and solid history of working. You'd have a very hard
time convincing me that a cache that directly addresses a performance
problem is a hack.
> It'd be so much
> simpler to make "a~=b;" equivalent to "a=a~b;". Then there's no
> "mystery" about the performance of the ~= operator. You can explain
> everyone: "yes, this allocates; if you want performance, use
> ArrayAppender". Hey, you could alias this ArrayAppender type to
> something like T[new] to make it feel more natural. But then, we're at
> the beginning again.
I think making ~= faster is worth pursuing.
Andrei
More information about the Digitalmars-d
mailing list