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