Sophie

Sophie

distrib > Mageia > 7 > i586 > media > core-release > by-pkgid > 016232f1d9a3f7bee85855d35a2bca58 > files > 253

elixir-doc-1.7.2-1.mga7.noarch.rpm

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="generator" content="ExDoc v0.19.1">
    <title>profile.fprof – Mix v1.7.2</title>
    <link rel="stylesheet" href="dist/app-240d7fc7e5.css" />
      <link rel="canonical" href="https://hexdocs.pm/mix/v1.7/Mix.Tasks.Profile.Fprof.html" />
    <script src="dist/sidebar_items-0c0044e6e4.js"></script>
    
  </head>
  <body data-type="tasks">
    <script>try { if(localStorage.getItem('night-mode')) document.body.className += ' night-mode'; } catch (e) { }</script>
    <div class="main">
<button class="sidebar-button sidebar-toggle">
  <span class="icon-menu" aria-hidden="true"></span>
  <span class="sr-only">Toggle Sidebar</span>
</button>
<button class="sidebar-button night-mode-toggle">
  <span class="icon-theme" aria-hidden="true"></span>
  <span class="sr-only">Toggle Theme</span>
</button>
<section class="sidebar">

  <a href="http://elixir-lang.org/docs.html" class="sidebar-projectLink">
    <div class="sidebar-projectDetails">
      <h1 class="sidebar-projectName">
Mix      </h1>
      <h2 class="sidebar-projectVersion">
        v1.7.2
      </h2>
    </div>
      <img src="assets/logo.png" alt="Mix" class="sidebar-projectImage">
  </a>

  <form class="sidebar-search" action="search.html">
    <button type="submit" class="search-button">
      <span class="icon-search" aria-hidden="true"></span>
    </button>
    <input name="q" type="text" id="search-list" class="search-input" placeholder="Search" aria-label="Search" autocomplete="off" />
  </form>

  <ul class="sidebar-listNav">
    <li><a id="extras-list" href="#full-list">Pages</a></li>

      <li><a id="modules-list" href="#full-list">Modules</a></li>

      <li><a id="exceptions-list" href="#full-list">Exceptions</a></li>

      <li><a id="tasks-list" href="#full-list">Mix Tasks</a></li>
  </ul>
  <div class="gradient"></div>
  <ul id="full-list" class="sidebar-fullList"></ul>
</section>

<section class="content">
  <div class="content-outer">
    <div id="content" class="content-inner">


      <h1>
        <small class="visible-xs">Mix v1.7.2</small>
mix profile.fprof        
          <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/mix/lib/mix/tasks/profile.fprof.ex#L1" title="View Source" class="view-source" rel="help">
            <span class="icon-code" aria-hidden="true"></span>
            <span class="sr-only">View Source</span>
          </a>
      </h1>


        <section id="moduledoc">
<p>Profiles the given file or expression using Erlang’s <code class="inline">fprof</code> tool.</p>
<p><code class="inline">fprof</code> can be useful when you want to discover the bottlenecks of a
sequential code.</p>
<p>Before running the code, it invokes the <code class="inline">app.start</code> task which compiles
and loads your project. Then the target expression is profiled, together
with all processes which are spawned by it. Other processes (e.g. those
residing in the OTP application supervision tree) are not profiled.</p>
<p>To profile the code, you can use syntax similar to the <code class="inline">mix run</code> task:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">mix</span><span class="w"> </span><span class="n">profile</span><span class="o">.</span><span class="n">fprof</span><span class="w"> </span><span class="o">-</span><span class="n">e</span><span class="w"> </span><span class="nc">Hello</span><span class="o">.</span><span class="n">world</span><span class="w">
</span><span class="n">mix</span><span class="w"> </span><span class="n">profile</span><span class="o">.</span><span class="n">fprof</span><span class="w"> </span><span class="n">my_script</span><span class="o">.</span><span class="n">exs</span><span class="w"> </span><span class="n">arg1</span><span class="w"> </span><span class="n">arg2</span><span class="w"> </span><span class="n">arg3</span></code></pre>
<p>This task is automatically reenabled, so you can profile multiple times
in the same Mix invocation.</p>
<h2 id="module-command-line-options" class="section-heading">
  <a href="#module-command-line-options" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Command line options
</h2>

<ul>
<li><code class="inline">--callers</code> - prints detailed information about immediate callers and called functions
</li>
<li><code class="inline">--details</code> - includes profile data for each profiled process
</li>
<li><code class="inline">--sort key</code> - sorts the output by given key: <code class="inline">acc</code> (default) or <code class="inline">own</code>
</li>
<li><code class="inline">--config</code>, <code class="inline">-c</code>  - loads the given configuration file
</li>
<li><code class="inline">--eval</code>, <code class="inline">-e</code> - evaluates the given code
</li>
<li><code class="inline">--require</code>, <code class="inline">-r</code> - requires pattern before running the command
</li>
<li><code class="inline">--parallel</code>, <code class="inline">-p</code> - makes all requires parallel
</li>
<li><code class="inline">--no-compile</code>    - does not compile even if files require compilation
</li>
<li><code class="inline">--no-deps-check</code> - does not check dependencies
</li>
<li><code class="inline">--no-archives-check</code> - does not check archives
</li>
<li><code class="inline">--no-start</code> - does not start applications after compilation
</li>
<li><code class="inline">--no-elixir-version-check</code> - does not check the Elixir version from mix.exs
</li>
<li><code class="inline">--no-warmup</code> - does not execute code once before profiling
</li>
</ul>
<h2 id="module-profile-output" class="section-heading">
  <a href="#module-profile-output" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Profile output
</h2>

<p>Example output:</p>
<pre><code class="nohighlight makeup elixir"><span class="c1">#                                        CNT    ACC (ms)    OWN (ms)</span><span class="w">
</span><span class="nc">Total</span><span class="w">                                 </span><span class="mi">200279</span><span class="w">    </span><span class="mf">1972.188</span><span class="w">    </span><span class="mf">1964.579</span><span class="w">
</span><span class="ss">:fprof</span><span class="o">.</span><span class="n">apply_start_stop</span><span class="o">/</span><span class="mi">4</span><span class="w">                  </span><span class="mi">0</span><span class="w">    </span><span class="mf">1972.188</span><span class="w">       </span><span class="mf">0.012</span><span class="w">
</span><span class="n">anonymous</span><span class="w"> </span><span class="k" data-group-id="3289526147-1">fn</span><span class="o">/</span><span class="mi">0</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="ss">:elixir_compiler_2</span><span class="w">       </span><span class="mi">1</span><span class="w">    </span><span class="mf">1972.167</span><span class="w">       </span><span class="mf">0.001</span><span class="w">
</span><span class="nc">Test</span><span class="o">.</span><span class="n">run</span><span class="o">/</span><span class="mi">0</span><span class="w">                                 </span><span class="mi">1</span><span class="w">    </span><span class="mf">1972.166</span><span class="w">       </span><span class="mf">0.007</span><span class="w">
</span><span class="nc">Test</span><span class="o">.</span><span class="n">do_something</span><span class="o">/</span><span class="mi">1</span><span class="w">                        </span><span class="mi">3</span><span class="w">    </span><span class="mf">1972.131</span><span class="w">       </span><span class="mf">0.040</span><span class="w">
</span><span class="nc">Test</span><span class="o">.</span><span class="n">bottleneck</span><span class="o">/</span><span class="mi">0</span><span class="w">                          </span><span class="mi">1</span><span class="w">    </span><span class="mf">1599.490</span><span class="w">       </span><span class="mf">0.007</span><span class="w">
</span><span class="n">...</span></code></pre>
<p>The default output contains data gathered from all profiled processes.
All times are wall clock milliseconds. The columns have the following meaning:</p>
<ul>
<li>CNT - total number of invocations of the given function
</li>
<li>ACC - total time spent in the function
</li>
<li>OWN - time spent in the function, excluding the time of called functions
</li>
</ul>
<p>The first row (Total) is the sum of all functions executed in all profiled
processes. For the given output, we had a total of 200279 function calls and spent
about 2 seconds running the code.</p>
<p>More detailed information is returned if you provide the <code class="inline">--callers</code> and
<code class="inline">--details</code> options.</p>
<p>When <code class="inline">--callers</code> option is specified, you’ll see expanded function entries:</p>
<pre><code class="nohighlight makeup elixir"><span class="nc">Mod</span><span class="o">.</span><span class="n">caller1</span><span class="o">/</span><span class="mi">0</span><span class="w">                             </span><span class="mi">3</span><span class="w">     </span><span class="mf">200.000</span><span class="w">       </span><span class="mf">0.017</span><span class="w">
</span><span class="nc">Mod</span><span class="o">.</span><span class="n">caller2</span><span class="o">/</span><span class="mi">0</span><span class="w">                             </span><span class="mi">2</span><span class="w">     </span><span class="mf">100.000</span><span class="w">       </span><span class="mf">0.017</span><span class="w">
  </span><span class="nc">Mod</span><span class="o">.</span><span class="n">some_function</span><span class="o">/</span><span class="mi">0</span><span class="w">                     </span><span class="mi">5</span><span class="w">     </span><span class="mf">300.000</span><span class="w">       </span><span class="mf">0.017</span><span class="w">  </span><span class="o">&lt;-</span><span class="o">-</span><span class="w">
    </span><span class="nc">Mod</span><span class="o">.</span><span class="n">called1</span><span class="o">/</span><span class="mi">0</span><span class="w">                         </span><span class="mi">4</span><span class="w">     </span><span class="mf">250.000</span><span class="w">       </span><span class="mf">0.010</span><span class="w">
    </span><span class="nc">Mod</span><span class="o">.</span><span class="n">called2</span><span class="o">/</span><span class="mi">0</span><span class="w">                         </span><span class="mi">1</span><span class="w">      </span><span class="mf">50.000</span><span class="w">       </span><span class="mf">0.030</span></code></pre>
<p>Here, the arrow (<code class="inline">&lt;--</code>) indicates the <strong>marked</strong> function - the function
described by this paragraph. You also see its immediate callers (above) and
called functions (below).</p>
<p>All the values of caller functions describe the marked function. For example,
the first row means that <code class="inline">Mod.caller1/0</code> invoked <code class="inline">Mod.some_function/0</code> 3 times.
200ms of the total time spent in <code class="inline">Mod.some_function/0</code> was spent processing
calls from this particular caller.</p>
<p>In contrast, the values for the called functions describe those functions, but
in the context of the marked function. For example, the last row means that
<code class="inline">Mod.called2/0</code> was called once by <code class="inline">Mod.some_function/0</code>, and in that case
the total time spent in the function was 50ms.</p>
<p>For a detailed explanation it’s worth reading the analysis in
<a href="http://www.erlang.org/doc/man/fprof.html#analysis">Erlang/OTP documentation for fprof</a>.</p>
<h2 id="module-caveats" class="section-heading">
  <a href="#module-caveats" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Caveats
</h2>

<p>You should be aware that the code being profiled is running in an anonymous
function which is invoked by <a href="http://wwww.erlang.org/doc/man/fprof.html"><code class="inline">:fprof</code> module</a>.
Thus, you’ll see some additional entries in your profile output,
such as <code class="inline">:fprof</code> calls, an anonymous
function with high ACC time, or an <code class="inline">:undefined</code> function which represents
the outer caller (non-profiled code which started the profiler).</p>
<p>Also, keep in mind that profiling might significantly increase the running time
of the profiled processes. This might skew your results if, for example, those
processes perform some I/O operations, since running time of those operations
will remain unchanged, while CPU bound operations of the profiled processes
might take significantly longer. Thus, when profiling some intensive program,
try to reduce such dependencies, or be aware of the resulting bias.</p>
<p>Finally, it’s advised to profile your program with the <code class="inline">prod</code> environment, since
this should provide more realistic insights into bottlenecks.</p>
        </section>

        <section id="summary" class="details-list">
          <h1 class="section-heading">
            <a class="hover-link" href="#summary">
              <span class="icon-link" aria-hidden="true"></span>
              <span class="sr-only">Link to this section</span>
            </a>
            Summary
          </h1>
          
  <div class="summary-functions summary">
    <h2>
      <a href="#functions">Functions</a>
    </h2>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#profile/2">profile(fun, opts \\ [])</a>
  </div>
    <div class="summary-synopsis"><p>Allows to programatically run the <code class="inline">fprof</code> profiler on expression in <code class="inline">fun</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#run/1">run(args)</a>
  </div>
    <div class="summary-synopsis"><p>A task needs to implement <code class="inline">run</code> which receives
a list of command line args</p>
</div>
</div>
  </div>
          
        </section>



        <section id="functions" class="details-list">
          <h1 class="section-heading">
            <a class="hover-link" href="#functions">
              <span class="icon-link" aria-hidden="true"></span>
              <span class="sr-only">Link to this section</span>
            </a>
            Functions
          </h1>
<div class="detail" id="profile/2">
  
    <span id="profile/1"></span>
  <div class="detail-header">
    <a href="#profile/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">profile(fun, opts \\ [])</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/mix/lib/mix/tasks/profile.fprof.ex#L176" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
          </div>
  <section class="docstring">
<p>Allows to programatically run the <code class="inline">fprof</code> profiler on expression in <code class="inline">fun</code>.</p>
<h2 id="profile/2-options" class="section-heading">
  <a href="#profile/2-options" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Options
</h2>

<ul>
<li><code class="inline">:callers</code> - prints detailed information about immediate callers and called functions
</li>
<li><code class="inline">:details</code> - includes profile data for each profiled process
</li>
<li><code class="inline">:sort</code> - sorts the output by given key: <code class="inline">:acc</code> (default) or <code class="inline">:own</code>
</li>
</ul>
  </section>
</div>
<div class="detail" id="run/1">
    <div class="detail-header">
    <a href="#run/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">run(args)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/mix/lib/mix/tasks/profile.fprof.ex#L131" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
          </div>
  <section class="docstring">
<p>A task needs to implement <code class="inline">run</code> which receives
a list of command line args.</p>
<p>Callback implementation for <a href="Mix.Task.html#c:run/1"><code class="inline">Mix.Task.run/1</code></a>.</p>
  </section>
</div>
        </section>

          <footer class="footer">
        <p>
          <span class="line">
            Built using
            <a href="https://github.com/elixir-lang/ex_doc" title="ExDoc" target="_blank" rel="help noopener">ExDoc</a> (v0.19.1),
          </span>
          <span class="line">
            designed by
            <a href="https://twitter.com/dignifiedquire" target="_blank" rel="noopener" title="@dignifiedquire">Friedel Ziegelmayer</a>.
            </span>
        </p>
      </footer>
    </div>
  </div>
</section>
</div>
  <script src="dist/app-a0c90688fa.js"></script>
  
  </body>
</html>