% language=us runpath=texruns:manuals/ontarget

\startcomponent ontarget-binary

\environment ontarget-style

\startchapter[title={The binary}]

This is a very short chapter. Because \LUAMETATEX\ is also a script runner, I
want to keep it lean and mean. So, when the size exceeded 3MB after we'd extended
the math engine, I decided to (finally) let all the \METAPOST\ number interfaces
pass pointers which brought down the binary 100K and below the 3MB mark again.

I then became curious about how much of the binary actually is taken by
\METAPOST, and a bit of calculation indicated that we went from 20.1\percent\ down
to 18.3\percent. Here is the state per May 13, 2022:

\startluacode

    local bytes = {
        liblua        =  515156,
        libluaoptional=  103668,
        libluarest    =   82492,
        libluasocket  =  105700,
        libmimalloc   =  178800,
        libminiz      =   51584,
        libmp         =  797636,
        libmp         =  797636, -- went from 20.1% to 18.3% after going more pointers
     -- libmp         =  797636 + (3061799 - 2960091),
        libpplib      =  325162,
        libtex        = 2207190,
    }

    local comment = {
        liblua        = "lua core, tex interfaces",
        libluaoptional= "framework, several small interfaces, cerf",
        libluarest    = "general helper libraries",
        libluasocket  = "helper that interfaces to the os libraries",
        libmimalloc   = "memory management partial",
        libminiz      = "minimalistic core",
        libmp         = "mp graphic core, number libraries, lua interfacing",
        libpplib      = "pdf reading core, encryption helpers",
        libtex        = "extended tex core",
    }

    local luametatex = 2960091
    local libraries  = 0 for k, v in next, bytes do libraries = libraries + v end
    local normalizer = luametatex/libraries

    local luastuff   = bytes.liblua
                     + bytes.libluaoptional
                     + bytes.libluarest
                     + bytes.libluasocket

    -------(luametatex) context.par()
    -------(libraries)  context.par()
    -------(normalizer) context.par()

    context.starttabulate { "|l|r|r|p|" }
        context.FL()
        context.NC() context.bold("component")
        context.NC() context.bold("pct")
        context.NC() context.bold("bytes")
        context.NC() context.bold("comment")
        context.NC() context.NR()
        context.ML()
        for k, v in table.sortedpairs(bytes) do
            context.NC() context(k)
            context.NC() context("%.1f",100*v/libraries)
            context.NC() context(math.round(normalizer*v))
            context.NC() context(comment[k])
            context.NC() context.NR()
        end
        context.ML()
        context.NC() context.bold("luametatex")
        context.NC()
        context.NC() context.bold(luametatex)
        context.NC() context("2022-05-13")
        context.NC() context.NR()
        context.LL()
    context.stoptabulate()

    function document.texstuff() context("%.1f\\percent",100 * bytes.libtex  /libraries) end
    function document.mpsstuff() context("%.1f\\percent",100 * bytes.libmp   /libraries) end
    function document.pdfstuff() context("%.1f\\percent",100 * bytes.libpplib/libraries) end
    function document.luastuff() context("%.1f\\percent",100 * luastuff       /libraries) end

\stopluacode

It is clear that the \TEX\ core is good for half of the code (\ctxlua {document .
texstuff ()}) with the accumulated \LUA\ stuff (\ctxlua {document . luastuff ()})
and \METAPOST\ being a good second (\ctxlua {document . mpsstuff ()}) and third
and the \PDF\ interpreting library a decent fourth (\ctxlua {document . pdfstuff
()}) place.

\stopchapter

\stopcomponent

