eugene.kobil

eugene.kobil

Hi everyone,

I worked on some issue on my project that was related to the performance slowdown brought by Protocol impl_for/1 active usage (on Elixir v.1.10.4).

I found out that on newer elixir versions (starting from v.1.11) this issue has gone.
According to my measurements the cost of impl_for call reduced from ~70ms on v1.10.4 to < 1ms on v1.11.

I tried to find some change logs that mention this improvement or at least some specific commit in v.1.10.4..v1.11 diff but did not succeed with it.

Does anyone knows what exactly could improve impl_for performance?

Thanks

Showing Posts 1 to 10

eugene.kobil

eugene.kobil OP

@josevalim maybe you know?

eugene.kobil

eugene.kobil OP

Other interesting detail is that impl_for on v.1.10.4 costs a lot when it returns false (no implementation found).
In case when it returns true performance is almost equal to the v1.11 impl_for version.

However in elixir v.1.11 impl_for works always fast regardless if implementation was found or not.

ltd

ltd

70ms for a single impl_for lookup? something else is amiss, how are you measuring this?

eugene.kobil

eugene.kobil OP

deadtrickster provided the link above to point where exact impl_for happens. Hope it can give some context.

70ms for a single impl_for lookup?

And it was not the worst case. I tried more series (~2k calls with different datatypes) and some series showed 100ms+ average.
However as I mentioned above it works that slow only when the protocol implementation is not found.
When implementation present (for Map) it works pretty fast, in 90% of cases it takes less then 20 microseconds.

how are you measuring this?

Just with

    start = :erlang.system_time(:microsecond)
    check = Mongo.Encoder.impl_for(value)
    :erlang.system_time(:microsecond) - start
josevalim

josevalim

Creator of Elixir

AFAIK we didn’t change anything around this so, if I had to guess, you are having an issue with protocol consolidation on previous versions. Perhaps the protocol was not consolidated for some reason?

ltd

ltd

thanks, i took 70ms as milliseconds, microseconds commonly abbreviated us.

I’m guessing measuring wall time around a single statement is susceptible, to context switch or other cpu/system activity. Maybe someone can suggest a better way to benchmark this.

ImNotAVirus

ImNotAVirus

You can use benchfella or benchee for example if you need more “accurate” results.

eugene.kobil

eugene.kobil OP

You right!
I’ve checked it with Protocol.consolidated?/1 and it returned false on v1.10.4 version but true on v.1.11

But what is the reason of such behaviour?

I’ve set consolidate_protocols: true explicitly both for mongodb and the project where I use it as a dependency.

On both versions Elixir.Mongo.Encoder.beam was present into consolidated app directory (_build/**/lib/**/consolidated/), but Elixir.Mongo.Encoder.Map.beam presented in _build/**/lib/mongodb/ebin/ only on v1.11

eugene.kobil

eugene.kobil OP

I mean exactly ~70ms (~70000 microseconds).

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
FlyingNoodle
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews