ProfilingTime
=============

With MLton and `mlprof`, you can <:Profiling:profile> your program to
find out how much time is spent in each function over an entire run of
the program.  To do so, compile your program with `-profile time`.
For example, suppose that `tak.sml` contains the following.

[source,sml]
----
sys::[./bin/InclGitFile.py mlton master doc/examples/profiling/tak.sml]
----

Compile with time profiling and run the program.
----
% mlton -profile time tak.sml
% ./tak
----

Display the profiling data.
----
% mlprof tak mlmon.out
6.00 seconds of CPU time (0.00 seconds GC)
function     cur
------------- -----
Tak.tak1.tak2 75.8%
Tak.tak1      24.2%
----

This example shows how `mlprof` indicates lexical nesting: as a
sequence of period-separated names indicating the structures and
functions in which a function definition is nested.  The profiling
data shows that roughly three-quarters of the time is spent in the
`Tak.tak1.tak2` function, while the rest is spent in `Tak.tak1`.

Display raw counts in addition to percentages with `-raw true`.
----
% mlprof -raw true tak mlmon.out
6.00 seconds of CPU time (0.00 seconds GC)
  function     cur    raw
------------- ----- -------
Tak.tak1.tak2 75.8% (4.55s)
Tak.tak1      24.2% (1.45s)
----

Display the file name and line number for each function in addition to
its name with `-show-line true`.
----
% mlprof -show-line true tak mlmon.out
6.00 seconds of CPU time (0.00 seconds GC)
        function           cur
------------------------- -----
Tak.tak1.tak2  tak.sml: 5 75.8%
Tak.tak1  tak.sml: 3      24.2%
----

Time profiling is designed to have a very small performance impact.
However, in some cases there will be a run-time performance cost,
which may perturb the results.  There is more likely to be an impact
with `-codegen c` than `-codegen native`.

You can also compile with `-profile time -profile-branch true` to find
out how much time is spent in each branch of a function; see
<:ProfilingCounts:> for more details on `-profile-branch`.


== Caveats ==

With `-profile time`, use of the following in your program will cause
a run-time error, since they would interfere with the profiler signal
handler.

* `MLton.Itimer.set (MLton.Itimer.Prof, ...)`
* `MLton.Signal.setHandler (MLton.Signal.prof, ...)`

Also, because of the random sampling used to implement `-profile
time`, it is best to have a long running program (at least tens of
seconds) in order to get reasonable time
