[HarfBuzz] caching plans with user features
Jonathan Kew
jfkthame at googlemail.com
Wed Oct 30 08:02:50 PDT 2013
On 30/10/13 14:42, Behdad Esfahbod wrote:
> In the mean time, I think we should switch hb-shape / hb-view to cache
> their own plan.
I considered doing that, but adding it to the engine itself seemed more
generally useful - it's likely to benefit many HB clients. (And then
doing it in the test tools would be redundant.)
>
> On Oct 29, 2013 10:10 PM, "Jonathan Kew" <jfkthame at googlemail.com
> <mailto:jfkthame at googlemail.com>> wrote:
>
> Hey Behdad,
>
> I figured out why the dashboard figures make it look as though we're
> surprisingly slow when running the XP fonts with simple scripts
> (e.g. Latin, Cyrillic).
>
> The problem is that my test framework passes "--features kern=0" for
> these tests in order to suppress use of the legacy 'kern' table, so
> that we'll better match Uniscribe's shaping results. But (somewhat
> surprisingly, at first glance) running with kern=0 is substantially
> *slower* than running without it:
>
> $ time hb-shape arial-winxp.ttf --text-file ru.txt > /dev/null
> real 0m38.831s
> user 0m38.726s
> sys 0m0.106s
>
> $ time hb-shape arial-winxp.ttf --text-file ru.txt --features kern=0
> > /dev/null
> real 0m50.087s
> user 0m49.984s
> sys 0m0.104s
>
> Explicitly specifying kern=1 is slower still, although the shaped
> results will be identical to the no-user-feature case:
>
> $ time hb-shape arial-winxp.ttf --text-file ru.txt --features kern=1
> > /dev/null
> real 0m56.122s
> user 0m56.022s
> sys 0m0.101s
>
> The reason for this, as you no doubt realized right away, is that
> passing *any* user features will prevent hb_shape() taking advantage
> of a cached shape plan in the font, and so we re-create the plan for
> every string. This is pretty expensive, and results in the slowdown
> here.
>
> Caching plans with arbitrary user features may be a bit tricky, but
> what I suggest we could do to address this for the common use case
> is to cache plans with user features *provided* all the user
> features are "global" (i.e. they have start=0, end=-1). And only use
> a cached plan if the list of features is exactly the same - i.e. the
> same tags and values (and global ranges) and listed in the same
> order. Make no attempt to decide whether different feature lists
> could in fact share the same plan, just refuse to use a cached plan
> if there's *any* difference. This makes it reasonably easy and cheap
> to do the caching, and in practice it's still likely to hit the vast
> majority of the use cases.
>
> The attached patch implements this, and with this applied, I now see
> kern=0 resulting in a substantial speed-up, as expected, instead of
> a slow-down compared to the default shaping:
>
> $ time hb-shape arial-winxp.ttf --text-file ru.txt --features kern=0
> > /dev/null
> real 0m30.807s
> user 0m30.722s
> sys 0m0.086s
>
> And explicitly setting kern=1 shows no significant difference from
> the original no-features case (the variation from the first run
> above is within the noise level):
>
> $ time hb-shape arial-winxp.ttf --text-file ru.txt --features kern=1
> > /dev/null
> real 0m37.544s
> user 0m37.453s
> sys 0m0.091s
>
> So I'd suggest it's worth doing something like this - unless of
> course you want to go the whole way and implement "smart" plan
> caching with user features, but IMO that sounds like it might be
> more effort than it's worth.
>
> JK
>
More information about the HarfBuzz
mailing list