[luatex] LuaLaTeX's performance
Pander
pander at users.sourceforge.net
Sun Nov 21 20:52:22 CET 2010
On 2010-11-19 23:03, Khaled Hosny wrote:
> On Fri, Nov 19, 2010 at 09:23:46PM +0100, Pander wrote:
>> On 2010-11-19 21:15, Khaled Hosny wrote:
>>>> The other thing is the performance. Now it could be that the current
>>>> executable is not optimised and is doing loads of debug logging.
>>>> However, my font catalogue is a good test case.
>>>>
>>>> XeLaTeX can process it in two parts because other it runs out of memory.
>>>> However, LuaLaTeX is hitting some sort of performance barrier halfway my
>>>> document and after using up almost 6 GB of memory I have to kill off the
>>>> process. Please see attached screenshots of memory usage.
>>>
>>> LuaTeX will happily use all memory available to it (unlike most other
>>> TeX engines which have hard-coded memory limit, IIUC). The current font
>>> loading code is not very memory efficient and for certain fonts e.g.
>>> fonts with huge kerning tables (some font developers like to say their
>>> fonts have tens of thousands of kerning pairs, like if it is a feature
>>> or something). I think post-texlive2010 releases of luatex made some
>>> progress in this area, but I'm not sure if Hans started making use of it
>>> or not.
>>>
>>>> How can LuaLaTeX's performance be improved? Is the current executable in
>>>> TLContrib a debug build with maximum logging?
>>>
>>> I don't think so, I don't think it would be that relevant either. If you
>>> can isolate the most offending fonts it might help in identifying and
>>> possibly fixing the cause.
>>
>> It it difficult to isolate since gradually memory gets eaten. Can I run
>> it with profiling or logging to report which font is using how much memory?
>
> Here is a quickly hacked script that takes a list of fonts and reports,
> in kb, the memory used for each:
>
> for _,v in ipairs(arg) do
> local b, m, f, t
> b = string.explode(v, "/")
> b = b[#b]
> m = collectgarbage("count")
> f = fontloader.open(v)
> if f then
> t = fontloader.to_table(f)
> fontloader.close(f)
> print(math.floor(collectgarbage("count") - m), b)
> t = nil
> collectgarbage('collect')
> end
> end
>
> Save it to some file and cal it something like:
>
> $ texlua foo.lua `find /path/to/fonts`
There are some pretty big ones:
20208 CODE2001.ttf
37006 DoulosSILCR.ttf
37122 DoulosSILR.ttf
20479 DejaVuSerif-Bold.ttf
20479 DejaVuSerifCondensed-Bold.ttf
20480 DejaVuSerif-BoldItalic.ttf
20480 DejaVuSerifCondensed-BoldItalic.ttf
20550 DejaVuSerifCondensed.ttf
20550 DejaVuSerif.ttf
20558 DejaVuSerifCondensed-Italic.ttf
20558 DejaVuSerif-Italic.ttf
21014 DejaVuSansMono.ttf
21014 mplus-1m-bold.ttf
21014 mplus-1m-light.ttf
21014 mplus-1m-medium.ttf
21014 mplus-1mn-bold.ttf
21014 mplus-1mn-light.ttf
21014 mplus-1mn-medium.ttf
21014 mplus-1mn-regular.ttf
21014 mplus-1mn-thin.ttf
21014 mplus-1m-regular.ttf
21014 mplus-1m-thin.ttf
21014 mplus-2m-bold.ttf
21014 mplus-2m-light.ttf
21014 mplus-2m-medium.ttf
21014 mplus-2m-regular.ttf
21014 mplus-2m-thin.ttf
22583 DejaVuSans-BoldOblique.ttf
22583 DejaVuSansCondensed-BoldOblique.ttf
22638 DejaVuSans-Oblique.ttf
22639 DejaVuSansCondensed-Oblique.ttf
22657 mplus-1c-black.ttf
22657 mplus-1c-bold.ttf
22657 mplus-1c-heavy.ttf
22657 mplus-1c-light.ttf
22657 mplus-1c-medium.ttf
22657 mplus-1c-regular.ttf
22657 mplus-1c-thin.ttf
22657 mplus-1p-black.ttf
22657 mplus-1p-bold.ttf
22657 mplus-1p-heavy.ttf
22657 mplus-1p-light.ttf
22657 mplus-1p-medium.ttf
22657 mplus-1p-regular.ttf
22657 mplus-1p-thin.ttf
22687 mplus-2c-regular.ttf
22687 mplus-2p-black.ttf
22687 mplus-2p-bold.ttf
22687 mplus-2p-heavy.ttf
22687 mplus-2p-light.ttf
22687 mplus-2p-medium.ttf
22687 mplus-2p-regular.ttf
22687 mplus-2p-thin.ttf
22688 mplus-2c-black.ttf
22688 mplus-2c-bold.ttf
22688 mplus-2c-heavy.ttf
22688 mplus-2c-light.ttf
22688 mplus-2c-medium.ttf
22688 mplus-2c-thin.ttf
23970 DejaVuSans-Bold.ttf
24004 DejaVuSansCondensed-Bold.ttf
24175 DejaVuSansCondensed.ttf
24175 DejaVuSans.ttf
37110 CharisSILB.ttf
37110 CharisSILR.ttf
38445 CharisSILI.ttf
38447 CharisSILBI.ttf
18546 UMTypewriter-Regular.otf
18646 STIXGeneralItalic.otf
18689 STIXGeneralBolIta.otf
19196 STIXGeneralBol.otf
19266 cmunit.otf
19308 cmuntx.otf
19311 cmunbtl.otf
19311 cmunbto.otf
19316 cmuntb.otf
19481 OldStandard-Italic.otf
19520 OldStandard-Bold.otf
19569 OldStandard-Regular.otf
19675 cmunst.otf
19830 cmuntt.otf
20339 FreeSerifBoldItalic.otf
20628 STIXGeneral.otf
20771 FreeSerifBold.otf
21101 FreeSerifItalic.otf
21667 xits-math.otf
22912 cmunssdc.otf
22917 cmunso.otf
23083 cmunbso.otf
23087 cmunbmo.otf
23087 cmunbsr.otf
23088 cmunbmr.otf
23302 cmunbxo.otf
23303 cmunbbx.otf
23303 cmunsi.otf
23455 cmunsx.otf
23456 cmunss.otf
23614 cmunoti.otf
23615 cmunobi.otf
23643 FreeSans.otf
23665 cmunobx.otf
24009 cmunci.otf
24072 cmunui.otf
24076 cmunbi.otf
24118 cmunti.otf
24761 cmunbl.otf
24761 cmunsl.otf
24784 cmunorm.otf
24919 cmunbx.otf
25018 cmunrm.otf
28229 FreeSerif.otf
20341 FreeSerifBoldItalic.ttf
20772 FreeSerifBold.ttf
21070 FreeSerifItalic.ttf
23580 FreeSans.ttf
28262 FreeSerif.ttf
But can I run a profiler because the way memory is eaten and is not
being released is the limiting factor.
When I run XeLaTeX of LuaLaTeX on my font catalogue, the first one
reports to run out of memeory but the second just continues to eat up
all my real and virtual memory and eventually I have to kill it.
When I split my document in two parts, each about 135 fonts almost all
in regular, bold, bolditalic and italic, XeLaTeX is able to process it
and write about 10MB for each part. It takes my Ubuntu system to use 900
MB RAM and 200 MB swap to process one part (1/2). (Memory use increases
over time, does XeLaTeX use dynamic allocation?)
LuaLaTeX is unable to process one of these parts as it needs much much
more memory to do the job, so I have to kill it off again. When I split
it in 4 parts with each 65 fonts, it works. Each PDF is about 4 or 5 MB.
It takes my Ubuntu system to use 3500 MB RAM and 200 MB swap to process
this part (1/4). (That dynamic memory allocation occurs here is expected.)
In short, LuaLaTeX uses (for this font intensive document on this system
etc etc) approximately (2*(3500+200))/(900+200) = 6.7 times more space
in memory then XeLaTeX.
Regards,
Pander
> Regards,
> Khaled
>
More information about the luatex
mailing list