Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / localhost / ProfilingCounts
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5 <meta name="generator" content="AsciiDoc 8.6.9">
6 <title>ProfilingCounts</title>
7 <link rel="stylesheet" href="./asciidoc.css" type="text/css">
8 <link rel="stylesheet" href="./pygments.css" type="text/css">
9
10
11 <script type="text/javascript" src="./asciidoc.js"></script>
12 <script type="text/javascript">
13 /*<![CDATA[*/
14 asciidoc.install();
15 /*]]>*/
16 </script>
17 <link rel="stylesheet" href="./mlton.css" type="text/css">
18 </head>
19 <body class="article">
20 <div id="banner">
21 <div id="banner-home">
22 <a href="./Home">MLton 20180207</a>
23 </div>
24 </div>
25 <div id="header">
26 <h1>ProfilingCounts</h1>
27 </div>
28 <div id="content">
29 <div id="preamble">
30 <div class="sectionbody">
31 <div class="paragraph"><p>With MLton and <span class="monospaced">mlprof</span>, you can <a href="Profiling">profile</a> your program to
32 find out how many times each function is called and how many times
33 each branch is taken. To do so, compile your program with
34 <span class="monospaced">-profile count -profile-branch true</span>. For example, suppose that
35 <span class="monospaced">tak.sml</span> contains the following.</p></div>
36 <div class="listingblock">
37 <div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">Tak</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
38 <span class="w"> </span><span class="k">struct</span><span class="w"></span>
39 <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">tak1</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
40 <span class="w"> </span><span class="k">let</span><span class="w"></span>
41 <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">tak2</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
42 <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">&gt;=</span><span class="w"> </span><span class="n">x</span><span class="w"></span>
43 <span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">z</span><span class="w"></span>
44 <span class="w"> </span><span class="k">else</span><span class="w"></span>
45 <span class="w"> </span><span class="n">tak1</span><span class="w"> </span><span class="p">(</span><span class="n">tak2</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="n">-</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p">),</span><span class="w"></span>
46 <span class="w"> </span><span class="n">tak2</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="n">-</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">),</span><span class="w"></span>
47 <span class="w"> </span><span class="n">tak2</span><span class="w"> </span><span class="p">(</span><span class="n">z</span><span class="w"> </span><span class="n">-</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">))</span><span class="w"></span>
48 <span class="w"> </span><span class="k">in</span><span class="w"></span>
49 <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">&gt;=</span><span class="w"> </span><span class="n">x</span><span class="w"></span>
50 <span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">z</span><span class="w"></span>
51 <span class="w"> </span><span class="k">else</span><span class="w"></span>
52 <span class="w"> </span><span class="n">tak1</span><span class="w"> </span><span class="p">(</span><span class="n">tak2</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="n">-</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p">),</span><span class="w"></span>
53 <span class="w"> </span><span class="n">tak2</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="n">-</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">),</span><span class="w"></span>
54 <span class="w"> </span><span class="n">tak2</span><span class="w"> </span><span class="p">(</span><span class="n">z</span><span class="w"> </span><span class="n">-</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">))</span><span class="w"></span>
55 <span class="w"> </span><span class="k">end</span><span class="w"></span>
56 <span class="w"> </span><span class="k">end</span><span class="w"></span>
57
58 <span class="k">val</span><span class="w"> </span><span class="k">rec</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
59 <span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">()</span><span class="w"></span>
60 <span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="mi">~1</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="s">&quot;this branch is not taken</span><span class="se">\n</span><span class="s">&quot;</span><span class="w"></span>
61 <span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">Tak</span><span class="p">.</span><span class="n">tak1</span><span class="w"> </span><span class="p">(</span><span class="mi">18</span><span class="p">,</span><span class="w"> </span><span class="mi">12</span><span class="p">,</span><span class="w"> </span><span class="mi">6</span><span class="p">)</span><span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">n-</span><span class="mi">1</span><span class="p">))</span><span class="w"></span>
62
63 <span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">5000</span><span class="w"></span>
64
65 <span class="k">fun</span><span class="w"> </span><span class="n">uncalled</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">()</span><span class="w"></span>
66 </pre></div></div></div>
67 <div class="paragraph"><p>Compile with count profiling and run the program.</p></div>
68 <div class="listingblock">
69 <div class="content monospaced">
70 <pre>% mlton -profile count -profile-branch true tak.sml
71 % ./tak</pre>
72 </div></div>
73 <div class="paragraph"><p>Display the profiling data, along with raw counts and file positions.</p></div>
74 <div class="listingblock">
75 <div class="content monospaced">
76 <pre>% mlprof -raw true -show-line true tak mlmon.out
77 623,610,002 ticks
78 function cur raw
79 --------------------------------- ----- -------------
80 Tak.tak1.tak2 tak.sml: 5 38.2% (238,530,000)
81 Tak.tak1.tak2.&lt;true&gt; tak.sml: 7 27.5% (171,510,000)
82 Tak.tak1 tak.sml: 3 10.7% (67,025,000)
83 Tak.tak1.&lt;true&gt; tak.sml: 14 10.7% (67,025,000)
84 Tak.tak1.tak2.&lt;false&gt; tak.sml: 9 10.7% (67,020,000)
85 Tak.tak1.&lt;false&gt; tak.sml: 16 2.0% (12,490,000)
86 f tak.sml: 23 0.0% (5,001)
87 f.&lt;branch&gt; tak.sml: 25 0.0% (5,000)
88 f.&lt;branch&gt; tak.sml: 23 0.0% (1)
89 uncalled tak.sml: 29 0.0% (0)
90 f.&lt;branch&gt; tak.sml: 24 0.0% (0)</pre>
91 </div></div>
92 <div class="paragraph"><p>Branches are displayed with lexical nesting followed by <span class="monospaced">&lt;branch&gt;</span>
93 where the function name would normally be, or <span class="monospaced">&lt;true&gt;</span> or <span class="monospaced">&lt;false&gt;</span>
94 for if-expressions. It is best to run <span class="monospaced">mlprof</span> with <span class="monospaced">-show-line true</span>
95 to help identify the branch.</p></div>
96 <div class="paragraph"><p>One use of <span class="monospaced">-profile count</span> is as a code-coverage tool, to help find
97 code in your program that hasn&#8217;t been tested. For this reason,
98 <span class="monospaced">mlprof</span> displays functions and branches even if they have a count of
99 zero. As the above output shows, the branch on line 24 was never
100 taken and the function defined on line 29 was never called. To see
101 zero counts, it is best to run <span class="monospaced">mlprof</span> with <span class="monospaced">-raw true</span>, since some
102 code (e.g. the branch on line 23 above) will show up with <span class="monospaced">0.0%</span> but
103 may still have been executed and hence have a nonzero raw count.</p></div>
104 </div>
105 </div>
106 </div>
107 <div id="footnotes"><hr></div>
108 <div id="footer">
109 <div id="footer-text">
110 </div>
111 <div id="footer-badges">
112 </div>
113 </div>
114 </body>
115 </html>