Hello, 

I've recently started reading and further exploring Erlang and Elixir's 
profiling tools and techniques. Of the three Erlang base profiling tools (
fprof, eprof and cprof), only fprof has been implemented as a Mix Task so 
far (fprof GitHub PR <https://github.com/elixir-lang/elixir/pull/3363> and 
elixir-lang-core 
thread 
<https://groups.google.com/d/msg/elixir-lang-talk/IBTHFO_EC7A/48QccC4Q4jMJ>
).

*Rationale:* 

I believe eprof and cprof should also be added as a Mix Task (each) for the 
following reasons:


   1. *Convenience*: more convenient to run as a Mix Task than inside an 
   IEx session or by other methods
   2. *Standardisation:* like said in the fprof elixir-lang-core thread it 
   allows for easier inspection and pair debugging by issuing a standard 
   command to retrieve results
   3. *Developer Awareness:* boosts awareness of Erlang/Elixir's profiling 
   capabilities
   4. *Purpose:* 
      1. *Eprof -* offers a different set of results and a different 
      behaviour (as per the docs):
         1. Medium result set vs. Large result set of fprof: simpler to 
         evaluate and comprehend when no deep profiling is necessary. Fprof 
         adds other criteria like callers and garbage collection
         2. Small slowdown of the system being profiled vs. Significant 
         slowdown of fprof: this helps achieve a result set closer to the 
         actual running system and offers less downtime while profiling)
      2. *Cprof - *offers a call count behaviour where execution time is 
      disregarded:
         1. Small and simple result
         2. Small slowdown
      5. *Why not:* I don't see why we should have one tool but not the 
   others :)

I've searched here, in the GitHub repo and in the Elixir Forum and I didn't 
find any proposals or intentions of adding this feature.

*Implementation:*

I believe profile.eprof.ex and profile.cprof.ex implementations should be 
as close as possible to profile.fprof.ex (implementation 
<https://github.com/elixir-lang/elixir/blob/master/lib/mix/lib/mix/tasks/profile.fprof.ex>)
 
for greater readability and maintainability. However, a large part of 
profile.fprof.ex is dedicated to formatting and printing the results, which 
won't be necessary in profile.eprof.ex since it automatically pretty prints 
the results. This will be necessary in profile.cprof.ex as its results 
aren't pretty printed.

One possible pitfall I see is when running async code. Eprof's and cprof's APIs 
need to be used like so:

:eprof.start
:eprof.start_profiling(<list of processes>) # or :eprof.profile(...)
<code to be profiled here>
:eprof.stop_profiling
:eprof.analyze

and

:cprof.start(...)
<code to be profiled here>
:cprof.pause
:cprof.analyze
:cprof.stop


I believe not everything may be profiled if a certain async task/process is 
being ran and is not finished before telling the profiler to stop or pause. 
This should happen in both eprof and cprof, meaning certain time consuming 
tasks won't be counted in eprof and certain calls won't be counted in cprof.
 

This is also corroborated in eprof docs with the following statement:

The programmer must ensure that the function given as argument is truly 
> synchronous and that no work continues after the function has returned a 
> value.


For most use cases I believe a script/Mix Task can be achieved, profiling 
functions/mfa's with sequential or synchronous code, specially regarding 
cprof. From what I've seen profile.fprof.ex also does not offer fprof's 
full API, but instead offers the options and behaviour which make sense in 
a Mix Task.

If this is accepted I'd like to give it a go at implementing one or both 
Mix Tasks during the next month or so. I'll probably start with cprof since 
it's the simplest tool.

Thanks!

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/d4917eac-2869-4dbf-ba78-19d3f095f7a5%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to