The use of String.split instead of :binary.split seems excessive here.
Could be a small but quick win.

On Tue, Aug 18, 2020 at 9:03 AM José Valim <jose.va...@dashbit.co> wrote:

> We need to go route 2, as 1 can change at any time (including if 2 is
> implemented). So thank you for opening an issue on Erlang's issues tracker,
> I am now watching it and I can act based on its status. :)
>
> On Mon, Aug 17, 2020 at 11:45 PM Trevor Brown <ad...@stratus3d.com> wrote:
>
>> Background
>>
>> I was recently working on a project that invoked `System.get_env/0` on
>> every request it handled. Someone changed the infrastructure the
>> application was deployed on and greatly increased the number of environment
>> variables (3x more) in the environment the Elixir application ran in, and
>> the performance of the application degraded by about that same amount (3x
>> slower than before). When I profiled the application I quickly found that
>> most of the request handling was spent waiting for the `System.get_env/0`
>> function to return. I changed the code so `System.get_env/0` was only
>> invoked on startup and the performance issue was resolved.
>>
>> Problem
>>
>> When I was working on the performance issue in the app the flame graphs
>> revealed something interesting - Erlang was actually formatting the
>> environment variables from a proplist to a list of strings in certain
>> format, and then Elixir was undoing the formatting by parsing the strings
>> back to a map! Because of this the performance of the `System.get_env/0`
>> function call is tied to the number of variables in the environment.
>>
>>
>>    - The Erlang code that formats the variables:
>>    https://github.com/erlang/otp/blob/master/lib/kernel/src/os.erl#L118
>>    - The Elixir code that parses them and puts them in a dictionary:
>>    
>> https://github.com/elixir-lang/elixir/blob/v1.10.3/lib/elixir/lib/system.ex#L438
>>
>>
>> Possible Solutions
>>
>> *1. Update the `System.get_env/0` function to use `os:list_env_vars/0`
>> function*
>>
>> This function already exists returns a proplists in the format
>> `{VariableName, VariableValue}`. All we need to do is replace the existing
>> code with
>>
>> def get_env do
>>    Enum.into(:os.list_env_vars(), %{})
>> end
>>
>> This would solve the performance issue and simplify the Elixir code! The
>> downside is that `os:list_env_vars/0` is not a documented function, which I
>> assume means it's not recommended for other applications to rely on it.
>>
>> *2. Wait for Erlang to change*
>>
>> Because I assumed `os:list_env_vars/0` is not a function that Elixir
>> should be relying on (although nothing prevents it from doing so), I have
>> created an enhancement ticket on the Erlang issue tracker to document
>> `os:list_env_vars/0` or implement another function that returns the
>> environment variables in a proplist with `{VariableName, VariableValue}`
>> tuples - https://bugs.erlang.org/browse/ERL-1332.
>> <https://bugs.erlang.org/browse/ERL-1332> Once Erlang implements a
>> documented function that does this we could then begin updating Elixir.
>>
>> Thoughts? I doubt this is something that is run into very often but it
>> could be easily improved.
>>
>> --
>> 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 elixir-lang-core+unsubscr...@googlegroups.com.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/elixir-lang-core/0aecb090-2cbb-46af-8ff4-e34337b123d4o%40googlegroups.com
>> <https://groups.google.com/d/msgid/elixir-lang-core/0aecb090-2cbb-46af-8ff4-e34337b123d4o%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
> --
> 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 elixir-lang-core+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4KHzHHTw_mU6vCUoK3yPYT5cQQBWicMkQ5cGTpZTmT26Q%40mail.gmail.com
> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4KHzHHTw_mU6vCUoK3yPYT5cQQBWicMkQ5cGTpZTmT26Q%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>


-- 
Best regards
Alexei Sholik

-- 
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 elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CAAPY6eMy9APxCjX5OCjdrKEByQTzzPQ4NMWQJuNCXzuXO-Xtyw%40mail.gmail.com.

Reply via email to