[erlang-questions] Small performance hint: avoid abusing module_info(attributes)

Max Lapshin <>
Thu Sep 28 08:56:44 CEST 2017


Hi.

We have moved from plain text lager logging to our own event system that
has main difference: we have limited amount of possible events that are
compiled in code.

In known_events.erl I have:


-event({stream_started, info, ["stream started"]}).

and then I write in code:


events:stream_started([{media,Name}]).

Later all this is printed (using lager formatting, it is cool).



So we are close to the problem.  My code that was handling such:
 events:stream_started was searching for predefined event via:
 known_events:module_info(attributes).

Suddenly eprof told that I need to look carefully at this place and I wrote
parse_transform that takes all attributes from module AST and compiles them
into code. Also I've generated function  known_events:find(Name) with all
possible clauses.

On single core of my macbook I got 4000 times speedup.  100 000 of fetches
known_events:all()  took about 8 seconds with module_info(attributes) and
about 2 milliseconds with generated and compiled code.


So lesson from here is: try to avoid calling module_info(attributes) in
innner loops. It may be suprisingly expensive.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20170928/bd4df1c5/attachment.html>


More information about the erlang-questions mailing list