/usr/share/doc/mlton/guide/ProfilingCounts is in mlton-doc 20100608-5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta name="robots" content="index,nofollow">
<title>ProfilingCounts - MLton Standard ML Compiler (SML Compiler)</title>
<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="all" href="common.css">
<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="screen" href="screen.css">
<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="print" href="print.css">
<link rel="Start" href="Home">
</head>
<body lang="en" dir="ltr">
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-833377-1";
urchinTracker();
</script>
<table bgcolor = lightblue cellspacing = 0 style = "border: 0px;" width = 100%>
<tr>
<td style = "
border: 0px;
color: darkblue;
font-size: 150%;
text-align: left;">
<a class = mltona href="Home">MLton MLTONWIKIVERSION</a>
<td style = "
border: 0px;
font-size: 150%;
text-align: center;
width: 50%;">
ProfilingCounts
<td style = "
border: 0px;
text-align: right;">
<table cellspacing = 0 style = "border: 0px">
<tr style = "vertical-align: middle;">
</table>
<tr style = "background-color: white;">
<td colspan = 3
style = "
border: 0px;
font-size:70%;
text-align: right;">
<a href = "Home">Home</a>
<a href = "TitleIndex">Index</a>
</table>
<div id="content" lang="en" dir="ltr">
With MLton and <tt>mlprof</tt>, you can <a href="Profiling">profile</a> your program to find out how many times each function is called and how many times each branch is taken. To do so, compile your program with <tt>-profile count -profile-branch true</tt>. For example, suppose that <tt>tak.sml</tt> contains the following. <p>
<pre class=code><B><FONT COLOR="#0000FF">structure</FONT></B> Tak =
<B><FONT COLOR="#0000FF">struct</FONT></B>
<B><FONT COLOR="#A020F0">fun</FONT></B> tak1 (x, y, z) =
<B><FONT COLOR="#A020F0">let</FONT></B>
<B><FONT COLOR="#A020F0">fun</FONT></B> tak2 (x, y, z) =
<B><FONT COLOR="#A020F0">if</FONT></B> y >= x
<B><FONT COLOR="#A020F0">then</FONT></B> z
<B><FONT COLOR="#A020F0">else</FONT></B>
tak1 (tak2 (x - <B><FONT COLOR="#5F9EA0">1</FONT></B>, y, z),
tak2 (y - <B><FONT COLOR="#5F9EA0">1</FONT></B>, z, x),
tak2 (z - <B><FONT COLOR="#5F9EA0">1</FONT></B>, x, y))
<B><FONT COLOR="#A020F0">in</FONT></B>
<B><FONT COLOR="#A020F0">if</FONT></B> y >= x
<B><FONT COLOR="#A020F0">then</FONT></B> z
<B><FONT COLOR="#A020F0">else</FONT></B>
tak1 (tak2 (x - <B><FONT COLOR="#5F9EA0">1</FONT></B>, y, z),
tak2 (y - <B><FONT COLOR="#5F9EA0">1</FONT></B>, z, x),
tak2 (z - <B><FONT COLOR="#5F9EA0">1</FONT></B>, x, y))
<B><FONT COLOR="#A020F0">end</FONT></B>
<B><FONT COLOR="#0000FF">end</FONT></B>
<B><FONT COLOR="#A020F0">val</FONT></B> <B><FONT COLOR="#A020F0">rec</FONT></B> f =
<B><FONT COLOR="#A020F0">fn</FONT></B> <B><FONT COLOR="#5F9EA0">0</FONT></B> => ()
| ~<B><FONT COLOR="#5F9EA0">1</FONT></B> => print <B><FONT COLOR="#BC8F8F">"this branch is not taken\n"</FONT></B>
| n => (Tak.tak1 (<B><FONT COLOR="#5F9EA0">18</FONT></B>, <B><FONT COLOR="#5F9EA0">12</FONT></B>, <B><FONT COLOR="#5F9EA0">6</FONT></B>) ; f (n-<B><FONT COLOR="#5F9EA0">1</FONT></B>))
<B><FONT COLOR="#A020F0">val</FONT></B> _ = f <B><FONT COLOR="#5F9EA0">5000</FONT></B>
<B><FONT COLOR="#A020F0">fun</FONT></B> uncalled () = ()
</PRE>
</p>
<p>
Compile with count profiling and run the program.
</p>
<pre>% mlton -profile count -profile-branch true tak.sml
% ./tak
</pre><p>
Display the profiling data, along with raw counts and file positions.
</p>
<pre>% mlprof -raw true -show-line true tak mlmon.out
623,610,002 ticks
function cur raw
--------------------------------- ----- -------------
Tak.tak1.tak2 tak.sml: 5 38.2% (238,530,000)
Tak.tak1.tak2.<true> tak.sml: 7 27.5% (171,510,000)
Tak.tak1 tak.sml: 3 10.7% (67,025,000)
Tak.tak1.<true> tak.sml: 14 10.7% (67,025,000)
Tak.tak1.tak2.<false> tak.sml: 9 10.7% (67,020,000)
Tak.tak1.<false> tak.sml: 16 2.0% (12,490,000)
f tak.sml: 23 0.0% (5,001)
f.<branch> tak.sml: 25 0.0% (5,000)
f.<branch> tak.sml: 23 0.0% (1)
uncalled tak.sml: 29 0.0% (0)
f.<branch> tak.sml: 24 0.0% (0)
</pre><p>
Branches are displayed with lexical nesting followed by <tt><branch></tt> where the function name would normally be, or <tt><true></tt> or <tt><false></tt> for if-expressions. It is best to run <tt>mlprof</tt> with <tt>-show-line true</tt> to help identify the branch.
</p>
<p>
One use of <tt>-profile count</tt> is as a code-coverage tool, to help find code in your program that hasn't been tested. For this reason, <tt>mlprof</tt> displays functions and branches even if they have a count of zero. As the above output shows, the branch on line 24 was never taken and the function defined on line 29 was never called. To see zero counts, it is best to run <tt>mlprof</tt> with <tt>-raw true</tt>, since some code (e.g. the branch on line 23 above) will show up with <tt>0.0%</tt> but may still have been executed and hence have a nonzero raw count.
</p>
</div>
<p>
<hr>
Last edited on 2007-08-21 03:44:16 by <span title="c-71-57-91-146.hsd1.il.comcast.net"><a href="MatthewFluet">MatthewFluet</a></span>.
</body></html>
|