<div class="gmail_quote">On Tue, Feb 16, 2010 at 3:45 PM, Jean-Marie Gaillourdet <span dir="ltr">&lt;<a href="mailto:jmg@gaillourdet.net">jmg@gaillourdet.net</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Hi,<br>
<div><div></div><div class="h5"><br>
Daniel Fischer wrote:<br>
&gt;&gt;        total alloc =     165,728 bytes  (excludes profiling overheads)<br>
&gt;&gt;<br>
&gt;&gt; COST CENTRE                    MODULE               %time %alloc<br>
&gt;&gt;<br>
&gt;&gt; CAF                            GHC.Handle             0.0   10.7<br>
&gt;&gt; CAF                            Text.Read.Lex          0.0    2.1<br>
&gt;&gt; CAF                            GHC.Read               0.0    1.2<br>
&gt;&gt; square                         Main                   0.0    2.8<br>
&gt;&gt; solve                          Main                   0.0    1.3<br>
&gt;&gt; show_aVx                       Main                   0.0    3.7<br>
&gt;&gt; readsPrec_aYF                  Main                   0.0   60.6<br>
&gt;&gt; main                           Main                   0.0    9.6<br>
&gt;&gt; genNums                        Main                   0.0    5.0<br>
&gt;&gt; cell                           Main                   0.0    1.2<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;                        individual    inherited<br>
&gt;&gt; COST CENTRE              MODULE<br>
&gt;&gt;       no.    entries  %time %alloc   %time %alloc<br>
&gt;&gt;<br>
&gt;&gt; MAIN                     MAIN<br>
&gt;&gt;         1           0   0.0    0.3     0.0  100.0<br>
&gt;&gt;  main                    Main<br>
&gt;&gt;       186           1   0.0    9.6     0.0   85.6<br>
&gt;&gt;  show_aVx               Main<br>
&gt;&gt;       196           2   0.0    3.7     0.0    3.7<br>
&gt;&gt;   cell                  Main<br>
&gt;&gt;       197          16   0.0    0.0     0.0    0.0<br>
&gt;&gt;  solve                  Main<br>
&gt;&gt;       188           5   0.0    1.3     0.0   11.8<br>
&gt;&gt;   genNums               Main<br>
&gt;&gt;       189           8   0.0    5.0     0.0   10.4<br>
&gt;&gt;    square               Main<br>
&gt;&gt;       194          88   0.0    2.8     0.0    3.2<br>
&gt;&gt;     cell                Main<br>
&gt;&gt;       195          16   0.0    0.4     0.0    0.4<br>
&gt;&gt;    col                  Main<br>
&gt;&gt;       192           4   0.0    0.7     0.0    1.1<br>
&gt;&gt;     cell                Main<br>
&gt;&gt;       193          16   0.0    0.4     0.0    0.4<br>
&gt;&gt;    row                  Main<br>
&gt;&gt;       190           4   0.0    0.7     0.0    1.1<br>
&gt;&gt;     cell                Main<br>
&gt;&gt;       191          16   0.0    0.4     0.0    0.4<br>
&gt;&gt;  readsPrec_aYF          Main<br>
&gt;&gt;       187           3   0.0   60.6     0.0   60.6<br>
&gt;&gt;  CAF                     GHC.Read<br>
&gt;&gt;       151           1   0.0    1.2     0.0    1.2<br>
&gt;&gt;  CAF                     Text.Read.Lex<br>
&gt;&gt;       144           8   0.0    2.1     0.0    2.1<br>
&gt;&gt;  CAF                     GHC.Handle<br>
&gt;&gt;       128           4   0.0   10.7     0.0   10.7<br>
&gt;&gt;  CAF                     GHC.Conc<br>
&gt;&gt;       127           1   0.0    0.0     0.0    0.0<br>
&gt;&gt;<br>
&gt;&gt; Does the column &#39;entries&#39; represent the number of times the function<br>
&gt;&gt; was called?<br>
&gt;<br>
&gt; Number of times it was &#39;entered&#39;, not quite the same as the number of times it was called.<br>
&gt; I think (Warning: speculation ahead, I don&#39;t *know* how the profiles are generated) it&#39;s<br>
&gt; thus:<br>
&gt; Say you call a function returning a list. One call, first entry. It finds the beginning of<br>
&gt; the list, the first k elements and hands them to the caller. Caller processes these, asks<br>
&gt; &quot;can I have more, or was that it?&quot;. Same call, second entry: f looks for more, finds the<br>
&gt; next m elements, hands them to caller. Caller processes. Repeat until whatever happens<br>
&gt; first, caller doesn&#39;t ask whether there&#39;s more or callee finds there&#39;s nothing more (or<br>
&gt; hits bottom).<br>
&gt;<br>
<br>
</div></div>Warning: speculation ahead, but is based on my knowledge on other profilers.<br>
<br>
Many profilers work statistically, they interrupt a program at more less<br>
random (or equal) intervals and inspect the stack, whick is of course<br>
quite difficult in Haskell as far as I understand it. I have interpreted<br>
the entries column as an indication for the amount of &quot;profile<br>
interrupts&quot; which happened when a function f was on top of the stack,<br>
whatever that means in Haskell.<br>
<br>
The manual of GHC 6.10.4, chapter 5 states:<br>
<br>
&gt;The actual meaning of the various columns in the output is:<br>
&gt;<br>
&gt;entries<br>
&gt;<br>
&gt;    The number of times this particular point in the call graph was<br>
&gt;    entered.<br>
<br>
<br>
So for me the question remains open, is &quot;entries&quot; a precisely counted<br>
value or a statistically determined one?</blockquote><div><br></div><div>I believe it&#39;s the latter. I think the RTS uses a periodic SIGALRM to figure out which function is currently executing and to record that in the profile. Simon Marlow would know.</div>

<div><br></div></div><br>