@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.

Attachment: OpenPGP_signature
Description: OpenPGP digital signature

Reply via email to