Sophie

Sophie

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

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.eprof – 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.Eprof.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.eprof        
          <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/mix/lib/mix/tasks/profile.eprof.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">eprof</code> tool.</p>
<p><code class="inline">:eprof</code> provides time information of each function call and can be useful
when you want to discover the bottlenecks related to this.</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 matching function calls using the Erlang trace BIFs. The tracing of
the function calls for that is enabled when the profiling is begun, and
disabled when profiling is stopped.</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">eprof</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">eprof</span><span class="w"> </span><span class="o">-</span><span class="n">e</span><span class="w"> </span><span class="s">&quot;[1, 2, 3] |&gt; Enum.reverse |&gt; Enum.map(&amp;Integer.to_string/1)&quot;</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">eprof</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">--matching</code> - only profile calls matching the given <code class="inline">Module.function/arity</code> pattern
</li>
<li><code class="inline">--calls</code> - filters out any results with a call count lower than this
</li>
<li><code class="inline">--time</code> - filters out any results that took lower than specified (in µs)
</li>
<li><code class="inline">--sort</code> - sorts the results by <code class="inline">time</code> or <code class="inline">calls</code> (default: <code class="inline">time</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-warmup</code> - skips the warmup step before profiling
</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-halt</code> - does not halt the system after running the command
</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>
</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">#                                               CALLS     % TIME µS/CALL</span><span class="w">
</span><span class="nc">Total</span><span class="w">                                              </span><span class="mi">24</span><span class="w"> </span><span class="mf">100.0</span><span class="w">   </span><span class="mi">26</span><span class="w">    </span><span class="mf">1.08</span><span class="w">
</span><span class="nc">Enum</span><span class="o">.</span><span class="n">reduce_range_inc</span><span class="o">/</span><span class="mi">4</span><span class="w">                             </span><span class="mi">5</span><span class="w">  </span><span class="mf">3.85</span><span class="w">    </span><span class="mi">1</span><span class="w">    </span><span class="mf">0.20</span><span class="w">
</span><span class="ss">:erlang</span><span class="o">.</span><span class="n">make_fun</span><span class="o">/</span><span class="mi">3</span><span class="w">                                  </span><span class="mi">1</span><span class="w">  </span><span class="mf">7.69</span><span class="w">    </span><span class="mi">2</span><span class="w">    </span><span class="mf">2.00</span><span class="w">
</span><span class="nc">Enum</span><span class="o">.</span><span class="n">each</span><span class="o">/</span><span class="mi">2</span><span class="w">                                         </span><span class="mi">1</span><span class="w">  </span><span class="mf">7.69</span><span class="w">    </span><span class="mi">2</span><span class="w">    </span><span class="mf">2.00</span><span class="w">
</span><span class="n">anonymous</span><span class="w"> </span><span class="k" data-group-id="6108087780-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_0</span><span class="o">.</span><span class="c">__FILE__</span><span class="o">/</span><span class="mi">1</span><span class="w">     </span><span class="mi">1</span><span class="w">  </span><span class="mf">7.69</span><span class="w">    </span><span class="mi">2</span><span class="w">    </span><span class="mf">2.00</span><span class="w">
</span><span class="ss">:erlang</span><span class="o">.</span><span class="n">integer_to_binary</span><span class="o">/</span><span class="mi">1</span><span class="w">                         </span><span class="mi">5</span><span class="w"> </span><span class="mf">15.39</span><span class="w">    </span><span class="mi">4</span><span class="w">    </span><span class="mf">0.80</span><span class="w">
</span><span class="ss">:erlang</span><span class="o">.</span><span class="n">apply</span><span class="o">/</span><span class="mi">2</span><span class="w">                                     </span><span class="mi">1</span><span class="w"> </span><span class="mf">15.39</span><span class="w">    </span><span class="mi">4</span><span class="w">    </span><span class="mf">4.00</span><span class="w">
</span><span class="n">anonymous</span><span class="w"> </span><span class="k" data-group-id="6108087780-2">fn</span><span class="o">/</span><span class="mi">3</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">each</span><span class="o">/</span><span class="mi">2</span><span class="w">                       </span><span class="mi">5</span><span class="w"> </span><span class="mf">19.23</span><span class="w">    </span><span class="mi">5</span><span class="w">    </span><span class="mf">1.00</span><span class="w">
</span><span class="nc">String.Chars.Integer</span><span class="o">.</span><span class="n">to_string</span><span class="o">/</span><span class="mi">1</span><span class="w">                    </span><span class="mi">5</span><span class="w"> </span><span class="mf">23.08</span><span class="w">    </span><span class="mi">6</span><span class="w">    </span><span class="mf">1.20</span><span class="w">

</span><span class="nc">Profile</span><span class="w"> </span><span class="n">done</span><span class="w"> </span><span class="n">over</span><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="n">matching</span><span class="w"> </span><span class="n">functions</span></code></pre>
<p>The default output contains data gathered from all matching functions. The first
row after the header contains the sums of the partial results and the average time
for all the function calls listed. The following rows contain the function call,
followed by the number of times that the function was called, then by the percentage
of time that the call uses, then the total time for that function in microseconds,
and, finally, the average time per call in microseconds.</p>
<p>When <code class="inline">--matching</code> option is specified, call count tracing will be started only for
the functions matching the given pattern:</p>
<pre><code class="nohighlight makeup elixir"><span class="c1">#                                               CALLS     % TIME µS/CALL</span><span class="w">
</span><span class="nc">Total</span><span class="w">                                               </span><span class="mi">5</span><span class="w"> </span><span class="mf">100.0</span><span class="w">    </span><span class="mi">6</span><span class="w">    </span><span class="mf">1.20</span><span class="w">
</span><span class="nc">String.Chars.Integer</span><span class="o">.</span><span class="n">to_string</span><span class="o">/</span><span class="mi">1</span><span class="w">                    </span><span class="mi">5</span><span class="w"> </span><span class="mf">100.0</span><span class="w">    </span><span class="mi">6</span><span class="w">    </span><span class="mf">1.20</span><span class="w">

</span><span class="nc">Profile</span><span class="w"> </span><span class="n">done</span><span class="w"> </span><span class="n">over</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">matching</span><span class="w"> </span><span class="n">functions</span></code></pre>
<p>The pattern can be a module name, such as <a href="https://hexdocs.pm/elixir/String.html"><code class="inline">String</code></a> to count all calls to that module,
a call without arity, such as <code class="inline">String.split</code>, to count all calls to that function
regardless of arity, or a call with arity, such as <a href="https://hexdocs.pm/elixir/String.html#split/2"><code class="inline">String.split/2</code></a>, to count all
calls to that exact module, function and arity.</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/eprof.html"><code class="inline">:eprof</code> module</a>.
Thus, you’ll see some additional entries in your profile output. It is also
important to notice that the profiler is stopped as soon as the code has finished running,
and this may need special attention, when: running asynchronous code as function calls which were
called before the profiler stopped will not be counted; running synchronous code as long
running computations and a profiler without a proper MFA trace pattern or filter may
lead to a result set which is difficult to comprehend.</p>
<p>You should expect a slowdown in your code execution using this tool since <code class="inline">:eprof</code> has
some performance impact on the execution, but the impact is considerably lower than
<a href="Mix.Tasks.Profile.Fprof.html"><code class="inline">Mix.Tasks.Profile.Fprof</code></a>. If you have a large system try to profile a limited
scenario or focus on the main modules or processes. Another alternative is to use
<a href="Mix.Tasks.Profile.Cprof.html"><code class="inline">Mix.Tasks.Profile.Cprof</code></a> that uses <code class="inline">:cprof</code> and has a low performance degradation effect.</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="#print_function_count/1">print_function_count(count)</a>
  </div>
</div>
<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">eprof</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="print_function_count/1">
    <div class="detail-header">
    <a href="#print_function_count/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">print_function_count(count)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/mix/lib/mix/tasks/profile.eprof.ex#L322" 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">
  </section>
</div>
<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.eprof.ex#L184" 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">eprof</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">:matching</code> - only profile calls matching the given pattern in form of
<code class="inline">{module, function, arity}</code>, where each element may be replaced by <code class="inline">:_</code>
to allow any value
</li>
<li><code class="inline">:calls</code> - filters out any results with a call count lower than this
</li>
<li><code class="inline">:time</code> - filters out any results that took lower than specified (in µs)
</li>
<li><code class="inline">:sort</code> - sort the results by <code class="inline">:time</code> or <code class="inline">:calls</code> (default: <code class="inline">:time</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.eprof.ex#L127" 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>