The 15.5ms attributed to re-reading the header on every reload is not that. A timer around each stage says the cached dump reads in 0.33ms, the extraction takes 3.3ms and the checks 0.55ms — about 4ms, once, in Session.create. The rest of flan reload's delta is Load and Check over 256 more declarations, and the +3.6ms a redefinition really pays is Check and Emit.redefinition against a bigger program. A C-c C-c reads no header at all: eval's forms carry no import, so no package is read. Both cache levels anyway, because a long-lived process should pay nothing twice. In the session, two tables: the dump by header, the declarations by header and by what the package already declares. On disk, the existing cache moved into the object cache directory beside the .o files. The in-memory key is the path and the flags with no mtime, so a header edited mid-session is not picked up until the session restarts — the rule a changed .c file follows, and the rule that keeps new signatures from being checked against a process still running the old layouts. Measured: repeat import 3.65ms to nothing; flan reload unchanged, as it must be, since it imports once per process.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%