[cairo] text measurement in perf?

Baz brian.ewins at gmail.com
Thu May 31 04:57:40 PDT 2007


On 30/05/07, JustFillBug <mozbugbox at yahoo.com.au> wrote:
> On 2007-05-29, Behdad Esfahbod <behdad at behdad.org> wrote:
> >
> > Seems like for both Chinese and Japanese a cache of around 2000
> > character is more than enough (same way that 256 is more than enough for
> > Western scripts).  Not sure how to fix this without regressing.  Xft has
> > a global cache size limit and a per-font one, and uses a global glyph
> > cache.  Cairo used to be similar but Keith rewrote it to use per-font
> > glyph cache.  We probably should make it adaptive.  I need to do similar
> > things in Pango too, so I'll give it some thought and come back.
> >
>
> 2 stage cache. 1st 256, 2nd 2048.
>

There's some micro-optimisations that could be made to the hashtable
code too, which'll make more of a difference if it gets larger.

In _cairo_hash_table_lookup_internal, key_is_unique is tested inside
the loop but never changes; step is tested and changed inside the loop
but can be initialized outside the loop instead. So we can tighten the
loop a bit:

    step = key->hash % hash_table->arrangement->rehash;
    if (step == 0)
        step = 1;

    if (key_is_unique) {
        // loop
    } else {
        // loop
    }

... this should cut 571 * 2 comparisons or so on a cache miss,
currently, and would cut 9000ish comparisons on a miss with the larger
cache.

However, the biggest cost is going to be the calls to
hash_table->keys_equal(key, *entry), which for this particular cache
boils down to an equality test. Could we do better here? A hacky
suggestion - if hash_table->keys_equal is null, do the loop with a
hash equality test instead, getting rid of the function call overhead.

I haven't timed any of this yet, just thinking about it while stuck at
work, but I remember those calls being high on the profiles in my
tests.

As Behdad says, this might not make a difference in real world
scenarios; if we're getting lots of cache misses the cache isn't
working right anyway.

-Baz


More information about the cairo mailing list