I was just having a look at the packfile format code, and I
have a suggestion on load-time performance of the code segment.
Currently, you read the file, parse out the various sections,
copy them elsewhere in memory, and byte-swap as necessary.
The overhead of doing this could be quite significant on large
applications/modules.

A "trick" that I've found very useful in the past is to design
the bytecode format so that it can be mmap'ed into a block of
memory, and then executed almost immediately with the minimum
number of fixups.  Rather than copying the instructions, you
execute them directly out of the mmap'ed region.

This has several benefits.  The obvious one is less copying
during program loading.  But less obvious is that it can make
the OS kernel do the hard work for you.

When a region is mmap'ed read-only, the OS kernel can manage
memory better.  When memory gets tight, it can simply discard
the page, as it can always go back to the file to get it
again.  A malloc'ed page, by comparison, must be copied out
to the swap file, which incurs additional overhead.

Even better, the kernel will perform demand-paging of the
bytecode into memory as the code is executed, giving much
faster startup times.  Multiple processes accessing the
same module will share the same page.  Copying everything
into a malloc'ed region defeats demand-paging.

Of course, this is only going to work if the packfile matches
the host endianness exactly.  A byteswap is still required if
the endianness doesn't match.  However, in any given install,
it is 95% likely that the pre-compiled modules will be set
up with the host order.

Key to making this work is that fixup information must be
well isolated within the file.  e.g. references to external
functions is by static index into a fixup table, not by
applying a relocation directly to the main code segment.

If you ever wonder why PIC-format ELF binaries are so weird,
it is to harness the mmap system deep inside the kernel to
do most of the hard work.

Just an idea.  Apologies if I'm rehashing something that has
already been discussed previously and discarded.

Cheers,

Rhys.

Reply via email to