That sounds like a good plan and it will be worth it especially if we can re-use a good part of the logic that is today in fprof. +1 for moving forward with this.
*José Valim* www.plataformatec.com.br Skype: jv.ptec Founder and Director of R&D On Sat, Feb 25, 2017 at 2:18 PM, Sasha Fonseca <[email protected]> wrote: > 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 > <https://groups.google.com/d/msgid/elixir-lang-core/d4917eac-2869-4dbf-ba78-19d3f095f7a5%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- 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/CAGnRm4LrRJta0QD5GuL0wnYP3uzpr1a%3DuytopiMr12sDxdGPOw%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
