My benchmarks were on 1.2.4. Map.new got much faster due to https://github.com/elixir-lang/elixir/commit/11f046a7f5a8a69b81b9627de0312e435c8e6b60 , by none other than Ben Wilson.
Thanks for that! On Thu, Jul 7, 2016 at 3:29 PM Ben Wilson <[email protected]> wrote: > Not for lists it doesn't > https://github.com/elixir-lang/elixir/blob/cbe03987daa9c01a9d7ce99137a1d76535efb5f9/lib/elixir/lib/enum.ex#L1185 > > Enum.map is for all intents and purposes exactly as fast as :lists.map. > :maps.fold just converts a map to a list and folds over it, and then turns > it back into a map. > > > On Thursday, July 7, 2016 at 6:25:28 PM UTC-4, Peter Hamilton wrote: > >> To be fair, :maps.map is the fastest. But it's about as fast as >> :lists.map . Enum has a lot of overhead. >> >> On Thu, Jul 7, 2016 at 3:23 PM Ben Wilson <[email protected]> wrote: >> > This is correct. map |> Enum.map(&fun) |> Map.new is the fastest possible >>> way to take a map and iterate over all of its keys. >>> >>> Reason being, building a new list of {k, v} pairs and calling the >>> `:maps.from_list` NIF always beats out N Map.put calls, which is how into: >>> %{} works. It also creates less garbage. Map.new is basically just >>> :maps.from_list if it gets passed a list. >>> >>> >>> On Thursday, July 7, 2016 at 2:48:39 PM UTC-4, Michał Muskała wrote: >>> >>>> What do you mean by not converting to a list? >>>> The fastest way right now of doing a map on a map is actually to >>>> convert to list, map and convert back to a map. >>>> I’d suspect that’s the case with a lot of data structures as well, >>>> actually. Lists are simply really good for recursion. >>>> The benefit is even greater if you do multiple operations on those >>>> lists, as the conversion happens (ideally) only >>>> once. >>>> >>>> Michał. >>>> >>>> On 07 Jul 2016, at 19:35, Peter Hamilton <[email protected]> wrote: >>>> >>>> Does the Enumerable protocol enable the performance improvement of not >>>> converting to a list? I don't think it does. >>>> >>>> On Thu, Jul 7, 2016, 10:24 AM Andrea Leopardi <[email protected]> >>>> wrote: >>>> >>>> Enum.into/3 should do what you want :) >>>>> >>>>> On Thursday, 7 July 2016, Wiebe-Marten Wijnja <[email protected]> >>>>> wrote: >>>>> >>>>>> I propose to add `into: collectable` as optional third argument to >>>>>> Enum.map. >>>>>> >>>>>> This would allow mapping over things without first converting it to a >>>>>> list and then convert it back. >>>>>> >>>>>> So: >>>>>> >>>>>> %{"a" => 1, "b" => 2} >>>>>> |> Enum.map(fn {k, v} -> {String.upcase(k), v} end) >>>>>> |> Enum.into(%{}) >>>>>> >>>>>> could be written as: >>>>>> >>>>>> %{"a" => 1, "b" => 2} >>>>>> |> Enum.map(fn {k, v} -> {String.upcase(k), v} end, into: %{}) >>>>>> >>>>>> Not having to do the list conversion in the middle might also improve >>>>>> performance. >>>>>> >>>>>> >>>>>> Right now, enumerating and collecting in one go is of course possible >>>>>> using `Kernel.SpecialForms.for`. `for` is however not very >>>>>> pipeline-friendly. >>>>>> >>>>>> >>>>>> What do you think? >>>>>> >>>>>> >>>>>> Sincerely, >>>>>> >>>>>> ~Wiebe-Marten >>>>>> >>>>>> -- >>>>>> 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/23c345b9-9ba1-48ea-8db0-6d2e9e700473%40googlegroups.com >>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/23c345b9-9ba1-48ea-8db0-6d2e9e700473%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> >>>>> -- >>>>> >>>> >>>>> Andrea Leopardi >>>>> [email protected] >>>>> >>>> >>>>> >>>>> -- >>>>> 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/CAM9Rf%2BLY6tyh%3DE6iM%2BA7rmyY8dKP-ddCJpB%2BWZDn0jCuJ7FKaA%40mail.gmail.com >>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAM9Rf%2BLY6tyh%3DE6iM%2BA7rmyY8dKP-ddCJpB%2BWZDn0jCuJ7FKaA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >>>> 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/CAOMhEnyR_50BhVdVugiQqDUxY9jUBNRCR23Bao%3DhwQ9Zmeh4PA%40mail.gmail.com >>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAOMhEnyR_50BhVdVugiQqDUxY9jUBNRCR23Bao%3DhwQ9Zmeh4PA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>> . >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>>> -- >>> 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/af052020-b329-49e0-a7b7-f0bf487c123c%40googlegroups.com >>> <https://groups.google.com/d/msgid/elixir-lang-core/af052020-b329-49e0-a7b7-f0bf487c123c%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- > 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/1afb754e-5d9b-41ff-a855-161610e63908%40googlegroups.com > <https://groups.google.com/d/msgid/elixir-lang-core/1afb754e-5d9b-41ff-a855-161610e63908%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- 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/CAOMhEnwfyoNrhs44QBm0SPTPZExAsq-xTrGJbTu_n9cCnToyLw%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
