[poppler] Small perf improvement to bug 11849

Albert Astals Cid aacid at kde.org
Wed Sep 26 11:21:29 PDT 2007


A Dimecres 26 Setembre 2007, Krzysztof Kowalczyk va escriure:
> So I started looking at perf again.
>
> The first improvement is ~4% rendering speedup for PDF in
> https://bugs.freedesktop.org/show_bug.cgi?id=11849.
>
> From the profile it looked like in this case a great deal (129899) of
> SplashPath objects was created/destroyed, yet at any given time only a
> few were allocated at the same time, so a small cache to recycle
> objects improves that. With this PDF I get the following changes for
> alloc functions counts:
>
> before:
> gfree	 0.31	0.31	100.00	1092627
> gmalloc	 0.18	0.18	100.00	548663
> grealloc 0.13	0.13	100.00	389808
>
> after:
> gfree	0.16	0.16	100.00	702930
> gmalloc	0.14	0.14	100.00	548663
> grealloc0.03	0.03	100.00	98382
>
> I measure speed up with the newly added test/perf-test, using release
> build on windows, like this:
> perftest.exe -timings c:\kjk\downloads\slow00.pdf
>
> For comparison I take the smallest number out of few runs.
>
> You'll see the code when I solve my branch pushing troubles.
>
> There are some issues:
> * this applies to all caches: cache must be emptied at some point,
> especially at the end, in order to not be seen as a leak. But poppler
> doesn't have mandatory init/free function to stuff it. So for now the
> user of the library needs to know. I was thinking it could be added
> either in PDFDoc destructor (based on assumption that we only want the
> cache to live as long as the document, because it really only improves
> a small class of PDFs) or in GlobalParams, since it must be
> constructed/destructed
> * right now a static function SplashFont::create()/destroy() must be
> called instead of new/delete SplashFont but I think it could be done
> transparently by substituting new/delete for this class. Need to dust
> up those C++ books.

I'm very hesitant on the amount of complex code that can introduce just to win 
a 4% on some specific pdf, but we'll see once your branch is online for 
testing.

And also please, don't overload the new operator, imho that's braindead and 
using SplashFont::create()/destroy() is just OK. new gives you the "normal" 
behvaiour and create()/destroy() the cached one, that makes sense.

Albert

> Also this approach could be used for a few other classes:
> SplashXPath                 47889    4	48	0	0	574668
> GfxPath	                       42970    2	80	0	0	1718800
> SplashXPathScanner     42074    4	208	0	0	2187848
> SplashSolidColor           38410   20	160	0	0	307280
>
> First number is total number of created objects during rendering this
> PDF, second is max number of objects existing at the same time. Second
> number is important for deciding cache size. If it's 4, cache of size
> 4 should provide almost 100% hit ratio (i.e. almost all allocations
> should be satisfied from the cache).
>
> -- kjk
> _______________________________________________
> poppler mailing list
> poppler at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/poppler




More information about the poppler mailing list