mlprof is right (I think) (but I have improvements)
Henry Cejtin
henry@clairv.com
Fri, 9 Jul 1999 21:19:10 -0500
I have pretty much convinced myself that the output of mlprof is (and was)
completely correct (but confusing). I have added 2 new arguments to mlprof
to try and make it more useful (at least to us), so now it takes 3 different
flags:
-d Without this flag, the label used is the non-detailed label put out by
Mlton. With this flag, it is the detailed label. It is up to Mlton
what this actually means, but it seems that what non-detailed labels
`C overhead', detailed divides among the following labels:
MLTON_chunk
MLTON_chunkSwitch (magic)
MLTON_endChunkSwitch (magic)
MLTON_gc (magic)
MLTON_main (magic)
The first of these (MLTON_chunk) is just time spent from the C
function call until we get to the switch to the correct piece of the
chunk. The second (MLTON_chunkSwitch) is the time spent switching
between the different parts of the chunk. The third
(MLTON_endChunkSwitch) is the default case which figures out which
chunk to go to next (only in the case that we are leaving the
chunk?). The fourth (MLTON_gc) is the time spent saving the C
variables into the right arrays and structures, calls the actual GC,
then copies the variables back. The last one (MLTON_main) is the
time spent in the actual trampoline loop.
-s Without this flag, C static functions are ignored, meaning that the
time spent in such a function is charged to the nearest preceeding
non-static C function. (This only makes sense if people tend to lay
out C code top-down, and if C compilers preserve this order. This is
largely true.) With this flag, static C functions are also charged.
If you use this flag, then all the things previously charged to
roundPage will now go to the correct (static) C functions (as well as
some to roundPage itself):
computeHeapSize
foreachGlobal
foreachLocal
foreachPointerInStackGen
foreachPointerInStack
foreachPointerInHeap
setStackLimit
allocateStack
translateStack
-f With this flag, each label has the C function (main or Chunk???)
added to the end (in parens). Thus if you want to see how the time
for a given label (without the -f) was divided between different
chunks, add this flag. E.g., you want to know how much `C overhead'
was in Chunk3, use this option.
All combinations of flags make sense to.
Here is the result of running mlprof with all 8 combinations of flags on the
5 minute self-compile. Tell me if it looks insane or believable. Everything
I checked for in manually looking through the data seemed to indicate that
mlprof is doing the right thing, but if there is some specific thing you
think is wrong, I can investigate.
begin 600 results.gz
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
M+Y)Z<#X6J^O$J9E2UCA1:J:4=<EV-4*[2.I*/;L2O0H1740U]6P?7RL3T
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
6QR*['$OM<BRXZ[E[_P.4:;3I)W$!``==
`
end