Fix
partial applicator simple runtime benchmark (optimized for 2-args):
julia> using FixArgs: Fix1 as Fix1a # for comparison w/ FixArgs.jl
julia> Fix1b = (f,x)->y->f(x,y); # for comparison w/ lambda
julia> f=(x,y)->x+y; f(1,2); g=Fix1(f, 1); @btime $g(2);
1.800 ns (0 allocations: 0 bytes)
julia> f=(x,y)->x+y; f(1,2); g=Base.Fix1(f, 1); @btime $g(2);
1.800 ns (0 allocations: 0 bytes)
julia> f=(x,y)->x+y; f(1,2); g=Fix1a(f, 1); @btime $g(2);
1.800 ns (0 allocations: 0 bytes)
julia> f=(x,y)->x+y; f(1,2); g=Fix1b(f, 1); @btime $g(2);
1.800 ns (0 allocations: 0 bytes)
julia> f=(x,y)->x+y; f(1,2); g=y->f(1, y); @btime $g(2); # type-unstable
19.157 ns (0 allocations: 0 bytes)
Fix
partial applicator simple compile time benchmark (optimized for 2-args):
julia> f=(x,y)->x+y; f(1,2); @time g=Fix1(f, 1); @time g(2);
0.002998 seconds (1.98 k allocations: 135.662 KiB, 92.55% compilation time)
0.002270 seconds (3.18 k allocations: 199.320 KiB, 97.75% compilation time)
julia> f=(x,y)->x+y; f(1,2); @time g=Base.Fix1(f, 1); @time g(2);
0.002760 seconds (1.32 k allocations: 79.189 KiB, 97.32% compilation time)
0.002505 seconds (2.39 k allocations: 146.041 KiB, 98.93% compilation time)
julia> f=(x,y)->x+y; f(1,2); @time g=Fix1a(f, 1); @time g(2);
0.006897 seconds (9.29 k allocations: 557.034 KiB, 96.58% compilation time)
0.004007 seconds (16.25 k allocations: 928.998 KiB, 99.33% compilation time)
julia> f=(x,y)->x+y; f(1,2); @time g=Fix1b(f, 1); @time g(2);
0.003930 seconds (657 allocations: 38.885 KiB, 99.45% compilation time)
0.003387 seconds (801 allocations: 46.613 KiB, 99.15% compilation time)
julia> f=(x,y)->x+y; f(1,2); @time g=y->f(1, y); @time g(2);
0.000034 seconds (25 allocations: 1.609 KiB)
0.002801 seconds (459 allocations: 29.776 KiB, 99.20% compilation time)