% language=us runpath=texruns:manuals/ontarget

\startcomponent ontarget-dk

\environment ontarget-style

\startchapter[title={Getting rid of jit}]

At the \NTG\ meeting there was a short discussion about performance of the
\OPENTYPE\ font machinery. Currently we still support \LUAJITTEX\ and although
the \MKIV\ code base is mostly separated from the \LMTX\ one there is still some
compromise going on, as some \LUA\ code is shared and needs to adapt to the fact
that \LUAJIT\ is stuck to \LUA 5.2 (sort of). One reason why we still support
\LUAJITTEX\ is that there are users who like the performance gain. However, if
these can switch to \CONTEXT\ we could get rid of \LUAJITTEX\ support. After all,
\LUAJIT\ is stalled as is \FFI. Of course a plain \TEX\ users can object to using
\CONTEXT\ but one can just use the basics and be as plain as possible.

Performance of \LUAMETATEX\ is quite okay and it often performs better than
\LUATEX\ or even \LUAJITTEX. One border case is for instance the somewhat
overdone in terms of split feature steps is the Brill font. So, I decided to do
some tests on my 2017 laptop that had replaced the 2013 one (Windows 10). We use
cross compiled binaries. Here is the test:

\starttyping
% \enableexperiments[fonts.compact]

\definefont[Fa][brill*default    @ 10pt]
\definefont[Fb][brill*default    @ 12pt]
\definefont[Fc][brill-bf*default @ 10pt]
\definefont[Fd][brill-bf*default @ 12pt]

\start \testfeatureonce{1000}{
    \Fa \samplefile{tufte}       \samplefile{tufte}\par
}\stop \page \edef\TimeA{\elapsedtime}
\start \testfeatureonce{1000}{
    \Fa \samplefile{tufte}\par\Fb\samplefile{tufte}\par
}\stop \page \edef\TimeB{\elapsedtime}
\start \testfeatureonce{1000}{
    \Fa \samplefile{tufte}    \Fb\samplefile{tufte}\par
}\stop \page \edef\TimeC{\elapsedtime}
\start \testfeatureonce{1000}{
    \Fa \samplefile{tufte}    \Fd\samplefile{tufte}\par
    \Fb \samplefile{tufte}    \Fc\samplefile{tufte}\par
}\stop \page \edef\TimeD{\elapsedtime}

\startTEXpage[offset=10pt]
    \strut\infofont
    2 par 1 font : \TimeA\par
    2 par 2 font : \TimeB\par
    1 par 2 font : \TimeC\par
    1 par 4 font : \TimeD\par
\stopTEXpage
\stoptyping

The next table shows the best times from three tests where each one produces 1693
pages in the default layout. We're talking of one run as normally \CONTEXT\ will
run till a two pass stable state is reached (unless it is forced to one run),
although in practice fixing a few typos will not for an extra run. Keep in mind
that in \LUAMETATEX\ we have a \LUA\ driven backend that is more flexible with
respect to fonts but therefore also adds some extra overhead. Also keep in mind
that four different fonts per paragraph is a rare case.

\starttabulate[|lT|c|c|c|c|]
\NC
    \BC 2 pars 1 font
    \BC 2 pars 2 fonts
    \BC 1 par 2 fonts
    \BC 1 par 4 fonts
\NC \NR
\ML
\BC luametatex         \NC  8.9 \NC  9.4 \NC 12.1 \NC 24.6 \NC \NR
\BC luametatex compact \NC  8.9 \NC  9.3 \NC  9.3 \NC 23.9 \NC \NR
\BC luatex             \NC 10.0 \NC 10.3 \NC 14.5 \NC 31.2 \NC \NR
\BC luajittex          \NC  8.0 \NC  8.1 \NC 11.4 \NC 23.2 \NC \NR
\stoptabulate

One should take these measurements with a grain of salt because it also depends
on the system load, but it shows that there is no real need to favor a
\LUAJITTEX\ setup over a \LUAMETATEX\ one. In the meantime the default \LUATEX\
binaries exceed 7~MB (and the hb variant adds quite a bit more) which
\LUAMETATEX\ stays around 3~MB which is nice for high performance setups with
thousands of (small) runs.

Just for the record, when we use Dejavu Serif we get 2767 pages and the following
timings. Again, the differences between \LUAMETATEX\ and \LUAJITTEX\ is not that
significant, especially when you realize that we're not doing anything fancy that
more runtime. In practice fonts are only part of the story.

\starttabulate[|lT|c|c|c|c|]
\NC
    \BC 2 pars 1 font
    \BC 2 pars 2 fonts
    \BC 1 par 2 fonts
    \BC 1 par 4 fonts
\NC \NR
\ML
\BC luametatex         \NC 4.2 \NC 4.4 \NC 5.0 \NC 10.8 \NC \NR
\BC luametatex compact \NC 4.2 \NC 4.5 \NC 4.5 \NC 10.5 \NC \NR
\BC luatex             \NC 4.9 \NC 5.0 \NC 6.2 \NC 13.3 \NC \NR
\BC luajittex          \NC 4.0 \NC 4.0 \NC 5.0 \NC 10.3 \NC \NR
\stoptabulate

% I tried to run \XETEX\ on the same file but that failed for some reason (it looks
% like it got stuck in updating the font database; some 50~MB binaries are needed
% so I guess I messed up somewhere).

\stopchapter

\stopcomponent

