[PATCH xserver 2/7] EXA: Use round robin instead of rand() for choosing eviction position.

Owen Taylor otaylor at redhat.com
Tue May 17 10:08:18 PDT 2011


On Tue, 2011-05-17 at 18:32 +0200, Michel Dänzer wrote:
> On Die, 2011-05-17 at 11:53 -0400, Owen Taylor wrote: 
> > On Tue, 2011-05-17 at 15:03 +0200, Michel Dänzer wrote:
> > > From: Michel Dänzer <daenzer at vmware.com>
> > > 
> > > This should be just as good on average but is less expensive.
> > 
> > If we're not hitting the cache, isn't the cost of rand() pretty much
> > noise? On my system, rand() seems to take about 10ns.
> 
> I wrote this patch because rand() showed up in profiles, and it
> increased x11perf -aa10text numbers.

If rand() shows up in profiles at all, then x11perf -aa10text is
exceeding the cache size, right? (this really suprises me, how many
different glyphs does aa10text show?) 

If x11perf -aa10text is exceeding the cache size then the exact details
of the cache replacement strategy will affect the numbers a lot more
than rand().

> > The nice thing about random replacement is that it reliable sticks to
> > being about "as good" as the average, while predictable strategies tend
> > to have cases where they work well, and cases which they work badly.
> > 
> > That is, if you have cache of size 10, does performance degrade smoothly
> > when you go from 9 glyphs to 11 glyphs, or do you drop off a cliff?
> 
> I haven't tested this specifically.
> 
> 
> > If libc rand() is too slow, then some inlined linear-congruential
> > generator could shave a few cycles.
> 
> I'm afraid I'm not really interested in working on that though.

Add an unsigned int evictionRand to ExaGlyphCacheRec, then when
updating:

 cache->evictionRand = cache->evictionRand * 1103515245 + 12345;
 cache->evictionPosition = cache->evictionRand % cache->size;

would be good enough. (Things could be done to improve the quality,
but just doesn't matter here)

- Owen




More information about the xorg-devel mailing list