On Wednesday, July 31, 2019 at 12:36:53 PM UTC-6, José Valim wrote:
>
> I thought about said approach but returning anonymous functions are not 
> very common in Elixir (probably due to the lack of currying) and also less 
> efficient. So I would prefer Function.identity/1.
>


Just for reference, one of my benchmarks:
```
Name                     ips        average  deviation         median 
        99th % 
Direct-Apply         23.02 M      0.0434 μs     ±7.10%      0.0420 μs 
     0.0540 μs 
Direct               22.77 M      0.0439 μs     ±8.35%      0.0420 μs 
     0.0630 μs 
Anon-Module          15.32 M      0.0653 μs   ±105.61%      0.0600 μs 
      0.100 μs 
Anon-Closure         15.21 M      0.0658 μs   ±183.59%      0.0600 μs 
      0.100 μs 
Anon-Empty           14.02 M      0.0713 μs     ±7.08%      0.0690 μs 
     0.0920 μs 
Indirect             12.49 M      0.0801 μs     ±8.96%      0.0760 μs 
      0.110 μs 
Indirect-Apply       12.49 M      0.0801 μs     ±7.03%      0.0760 μs 
      0.100 μs 

Comparison:  
Direct-Apply         23.02 M 
Direct               22.77 M - 1.01x slower 
Anon-Module          15.32 M - 1.50x slower 
Anon-Closure         15.21 M - 1.51x slower 
Anon-Empty           14.02 M - 1.64x slower 
Indirect             12.49 M - 1.84x slower 
Indirect-Apply       12.49 M - 1.84x slower 

Memory usage statistics: 

Name              Memory usage 
Direct-Apply             280 B 
Direct                   280 B - 1.00x memory usage 
Anon-Module              280 B - 1.00x memory usage 
Anon-Closure             280 B - 1.00x memory usage 
Anon-Empty               280 B - 1.00x memory usage 
Indirect                 280 B - 1.00x memory usage 
Indirect-Apply           280 B - 1.00x memory usage
``` 

Direct's are direct calls, like `SomeModule.somefunc()`, Indirects are 
`module_in_variable.somefunc()` (and apply is the `apply/3` function), 
anon-module is of the `&SomeModule.somefunc/0` form, anon-closure is 
capturing local non-static state  and returning that, and anon-empty is 
just `fn() -> nil end`.  No clue why anon-empty is the slowest but that's 
very consistent on these runs no matter how many times I run the benchmark 
on multiple computers.

So module calls are the fastest by an almost imperceptible amount.  Then 
again you can just return a module call from the function itself...  ^.^

And I think it's not the currying in Elixir is why, I actually do return 
quite a few anonymous functions in a lot of my code, it's easy enough, it's 
just that it's not the 'style' of many elixir'ists, many of them don't come 
from functional languages so they don't think in a functional programming 
style.  Functional programming is not just focusing on the functions, it is 
the transformation of the functions as well, which isn't really done in 
'most' of the elixir ecosystem.

-- 
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/bd74e77f-6a4a-4aef-9164-628a32c27e4d%40googlegroups.com.

Reply via email to