[MLton-user] Tracking down allocations
Matthew Fluet
fluet at tti-c.org
Sun Jul 15 09:18:34 PDT 2007
> I got a confusing result that I
> hope someone on this list can explain to me. I had a function of the
> general form
>
> fun f intArrayRef1 intArrayRef2 i =
> let
> fun g j k = ...big but non-recursive...
>
> val j = ...
> val k = ...
> in
> g j k
> end;
>
> and the result of
>
> mlprof -show-line true -raw true x mlmon.out
>
> pointed me to the "let" line with 40,000,000,000 allocations being
> done. Where exactly should I look next to see where the allocations
> are being done?
You could try compiling with
mlton -profile alloc -profile-branch true -keep ssa -keep ssa2
That will keep the main intermediate language programs. You ought to be
able to look through the .ssa and .ssa2 files for statements of the form
Enter <fn> <source-pos>
and
Leave <fn> <source-pos>
These profiling statements should properly nest (according to the
control-flow graph). Looking for your function "f" above, you should be
able to trace out the activities going on. Allocations aren't explicitly
marked in the ILs, but basically anything that looks like
x = C (x_1, x_2, x_3)
corresponds to an allocation, as does
x = Array_array (y)
Also, if you are working with a recent build of the compiler from the
Subversion repository, then the recent compiler flag
-profile-val true
will additionally profile (expansive) val bindings (such as val j = ...
and val k = ... in your code above), which could expose finer-grained
information.
More information about the MLton-user
mailing list