What if a syntax for matching on keyword lists that allowed for items in any position was added to Elixir? Something like (just shooting from the hip) `[…foo: bar]` ? Then you could have your cake and eat it too, right?
On Thu, Oct 27 2022 at 5:25 PM, Brandon Gillespie < bran...@cold.org > wrote: > > > > On 10/27/22 3:42 PM, José Valim wrote: > > > >> > 1. Maps are slower (significantly enough to avoid IMHO), but do give the >> flexibility desired (1.79x slower, which could compound if in the wrong >> place) >> >> >> Do you have a source for the 1.79 slower? >> >> >> >> I don't expect maps to be slower but, more importantly, the difference >> here should be negligible because options rarely exceed more than a dozen >> keys and in those scenarios lookups are in the order of single-digit >> microseconds ( source ( >> https://github.com/erlang/otp/issues/6139#issuecomment-1182995087 ) ) *in >> the worst case*. So it seems counter productive to say you wouldn't pick >> the more flexible option because an operation will take 1.75us instead of >> 1us (assuming it is indeed slower). :) >> >> >> Plus maps have other benefits such as reading multiple keys at once which >> will certainly offset keyword lists. >> >> > > > > 1.79 times, as I read it, not 1.79us. And of course benchmarks being > highly subjective, now that I retooled it it's at 2.12x slower (see notes > at the very bottom for likely reasons why). > > > > > What drove me to look into this is a very specific situation we face in my > project where we process a high frequency of events on a databus per > second, and it was bogging down. As I isolated easy wins (external > database calls) I started looking into other inefficiencies. > > > > Specifically this is a call that looks at the before and after state of a > struct and from that decides if changes should be handled or not. > > > > I expect many will likely find fault with the implementation of this > benchmark, but it is for a specific use case... for the room in general: > let's not digress on if there are better ways to do a thing or not :) > > > > > The gist includes three scenarios: > > > > > * ordered — arguments are given in order and pipelined (this is what we > are using now) > > * map_get — arguments are culled ala Map.take() > * map_pattern — arguments use a pattern match w/a dictionary > > > > > The #'s: > > > > Name ips average deviation median > 99th % > ordered 5.06 M 197.65 ns ±21980.53% 143 ns > 230 ns > map_get 3.86 M 259.27 ns ±28310.93% 183 ns > 494 ns > map_pattern 2.39 M 418.72 ns ±11140.31% 426 ns > 551 ns > > Comparison: > ordered 5.06 M > map_get 3.86 M - 1.31x slower +61.61 ns > map_pattern 2.39 M - 2.12x slower +221.07 ns > > > > > > > > > The gist / benchmark that created the above: > https://gist.github.com/srevenant/ed28a0cf2a167379a21eb482291313ce > > > > > > > > > > Why the change? > > > > > I did change it from when I ran it previously to come up with the 1.79x > number, because it was referencing our code base, and in the previous > benchmark I had less arguments it was matching against. I added a few more > arguments to amplify the situation, as you can see. > > > > I do realize this is NOT the heart of my performance problem, so I hope > others can avoid digressing into "you should do it this other way" type > discussions :D > > > > > This is just something that came out of exploring some performance issues. > > > > > And the suggestion for efficient named arguments came because we'd > switched to ordered arguments, and then the code was flipped in one place > (a, b) vs (b, a) (face-palm) > > > > -Brandon > > > > > > > -- > 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/f3307a40-b4fe-c66f-0576-a162202dfee2%40cold.org > ( > https://groups.google.com/d/msgid/elixir-lang-core/f3307a40-b4fe-c66f-0576-a162202dfee2%40cold.org?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/l9rn6rom.0571cb07-82c4-44b5-a702-4f036f71a797%40we.are.superhuman.com.