@Allen Madsen: I have added `Enum.filter` to the benchmark.
Also, by telling the compiler to inline the calls to `next` and `iterator`, removing redundant guard-clause checks and not supporting map-iterators (as the rest of the `Map`-module doesn't expose them either), `Map.filter` is able to be slightly /faster/ than `:maps.filter` 🥳. For posterity, the related elixir-lang PR can be found here <https://github.com/elixir-lang/elixir/pull/11239>. ~Marten/Qqwy On 11-09-2021 10:27, José Valim wrote: > Thanks Marten, so I think we can proceed with a PR for Map.filter and > Map.map, both passing tuples as argument. Note we will need the same > for Keyword. Could you please submit it? > > On Fri, Sep 10, 2021 at 11:08 PM Allen Madsen > <[email protected] <mailto:[email protected]>> wrote: > > Perhaps also benchmark the combination of Enum.filter/2 and > Enum.into/2, since this is the current way with the elixir > standard library. > > Allen Madsen > http://www.allenmadsen.com <http://www.allenmadsen.com> > > > On Fri, Sep 10, 2021 at 1:21 PM Wiebe-Marten Wijnja > <[email protected] <mailto:[email protected]>> wrote: > > I've done some benchmarking > > > Implementations: > > * :maps.filter(pred, map_or_iter): The baseline we benchmark > against. Expects a two-parameter function, which goes > against Elixir idioms, where a two-element tuple would be > used instead. > * MapsFilterProf.wrapped_filter(map_or_iter, fun): Wraps > :maps.filter/2, to adapt it to a two-element tuple input. > * MapsFilterProf.direct_filter(map_or_iter, fun): > Re-implements :maps.filter/2 directly, with the assumption > that this might be more performant than wrapping a > function with an extra intermediate anonymous function. > * MapsFilterProf.direct_filter_inlined(map_or_iter, fun): > Similar to direct_filter/2, but inlines the other fnctions > the other implementation would call from the :maps module > as well (most importantly: next/1 which is called once per > map element). This is done since local function calls are > usually faster (and more often optimized by the compiler) > than inter-module function calls. > > > > log-log graph comparing the four filter-implementations, > plotting map-size against time. > Benchmarking was done on Elixir 1.12.0 / Erlang 24.0.1, on an > x86-64 Linux machine with 8GB RAM. > > It can clearly be seen from this graph that the difference in > implementations is very small. > Especially the difference between |direct_filter_inlined/2| > vs. |:maps.filter/2| is neglegible. |wrapped_filter/2| is, > as was expected, a little bit (averaging at ~20-40%) slower > than the former two. > > On average, the |direct_filter_inlined/2| seems to be slightly > faster than the non-inlined version. > This difference is small, but significant (i.e. reproducible > across benchmark re-runs). > > > Repo with implementation + benchmarking details > <https://github.com/Qqwy/elixir-profiling-maps_filter> > > The particular benchmark I wrote filters all odd values from a > map that has the shape %{0 => 0, 1 => 1, 2 => 2, ... n => n}. > This seems like an appropriate test for filtering maps, but > maybe there are even better ideas? > > > ~Marten/Qqwy > > On 09-09-2021 21:44, José Valim wrote: >> Exactly. You can build profiling on top of that and let us >> know how the different approaches go! >> >> On Thu, Sep 9, 2021 at 8:22 PM Wiebe-Marten Wijnja >> <[email protected] <mailto:[email protected]>> wrote: >> >> Sorry for double-posting, but what also might be relevant >> is that other than I thought `:maps.filter` is not a BIF >> (c. f. its implementation at >> >> https://github.com/erlang/otp/blob/master/lib/stdlib/src/maps.erl#L300) >> >> <https://github.com/erlang/otp/blob/master/lib/stdlib/src/maps.erl#L300)> >> >> We might be able to write our own alternative that wraps >> the interface one level of abstraction lower, i. e. >> building on top of the map iterators and from_list >> functions directly. >> >> On September 9, 2021 6:13:00 PM UTC, Wiebe-Marten Wijnja >> <[email protected] <mailto:[email protected]>> wrote: >> >> Where can the results of the benchmark/profiling be >> found? I wonder if there are tricks to reduce the >> overhead. Also, maybe the impact of this might >> possibly be less in newer OTP versions, which is >> something that might be worth checking. >> >> On September 9, 2021 12:31:54 PM UTC, "José Valim" >> <[email protected] >> <mailto:[email protected]>> wrote: >> >> Last time we had this discussion, the main >> concern was that :maps.filter emits key, value as >> arguments instead of being in a tuple, and that >> was incongruent to the rest of Elixir’s API. We >> could wrap it in a tuple, but that added some >> considerable overhead. So we need to make a choice. >> >> On Thu, Sep 9, 2021 at 14:09 Adam Millerchip >> <[email protected] >> <mailto:[email protected]>> wrote: >> >> Bump. Is there any opposition to this? I >> might (eventually) take a look if nobody >> beats me to it, as long as there isn't any >> opposition. >> On Friday, 12 March 2021 at 06:18:06 UTC+9 >> Keith Salisbury wrote: >> >> Was there a reason this didn't fly? >>  >> >> -- >> 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] >> >> <mailto:[email protected]>. >> To view this discussion on the web visit >> >> https://groups.google.com/d/msgid/elixir-lang-core/fd2477c3-0983-4cba-a1fb-7de308fee6dfn%40googlegroups.com >> >> <https://groups.google.com/d/msgid/elixir-lang-core/fd2477c3-0983-4cba-a1fb-7de308fee6dfn%40googlegroups.com?utm_medium=email&utm_source=footer>. >> >> -- Sent from my Android device with K-9 Mail. Please >> excuse my brevity. >> >> -- Sent from my Android device with K-9 Mail. Please >> excuse my brevity. >> -- >> 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] >> <mailto:[email protected]>. >> To view this discussion on the web visit >> >> https://groups.google.com/d/msgid/elixir-lang-core/E41D08E3-85FF-422B-A48A-6AC129CF3C72%40resilia.nl >> >> <https://groups.google.com/d/msgid/elixir-lang-core/E41D08E3-85FF-422B-A48A-6AC129CF3C72%40resilia.nl?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 >> [email protected] >> <mailto:[email protected]>. >> To view this discussion on the web visit >> >> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4J0DiHv2Pmq%3DY3kvhss_RjrLZRGs3j1yRMS%3DJK7Binrzw%40mail.gmail.com >> >> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4J0DiHv2Pmq%3DY3kvhss_RjrLZRGs3j1yRMS%3DJK7Binrzw%40mail.gmail.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 > [email protected] > <mailto:[email protected]>. > To view this discussion on the web visit > > https://groups.google.com/d/msgid/elixir-lang-core/e35fd630-9955-a674-c02b-d29a17b29f91%40resilia.nl > > <https://groups.google.com/d/msgid/elixir-lang-core/e35fd630-9955-a674-c02b-d29a17b29f91%40resilia.nl?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 [email protected] > <mailto:[email protected]>. > To view this discussion on the web visit > > https://groups.google.com/d/msgid/elixir-lang-core/CAK-y3Cs2%2BQr_m6e_3R41H44iwcj65D4OHT9hZ2_P2FnVPhzE0Q%40mail.gmail.com > > <https://groups.google.com/d/msgid/elixir-lang-core/CAK-y3Cs2%2BQr_m6e_3R41H44iwcj65D4OHT9hZ2_P2FnVPhzE0Q%40mail.gmail.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 [email protected] > <mailto:[email protected]>. > To view this discussion on the web visit > https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4L1RaXVAcwCnDvNT9Ze%2BZoghgW7GuAOwbuR6-emeOxPBA%40mail.gmail.com > <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4L1RaXVAcwCnDvNT9Ze%2BZoghgW7GuAOwbuR6-emeOxPBA%40mail.gmail.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 [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/ec342990-53f8-cf90-fba1-c7b3cc145805%40resilia.nl.
OpenPGP_signature
Description: OpenPGP digital signature
