I was reading this section in the manual https://docs.julialang.org/en/stable/manual/performance-tips/#the-dangers-of-abusing-multiple-dispatch-aka-more-on-types-with-values-as-parameters , and I realized I’ve done this in some cases, as it is very convenient. I construct an instance of a type for dispatch purposes, but which type depends on some condition. Here’s two test examples
using BenchmarkTools immutable Type1 end immutable Type2 end f(x, ::Type1) = 3.*x f(x, ::Type2) = 5.*x function test1(N) for i = 1:N r = rand() if r > .5 a = Type1() else a = Type2() end f(r, a) end end function test2(N) for i = 1:N r = rand() if r > .5 a = Type1() f(r, a) else a = Type2() f(r, a) end end end @benchmark test1(1000) median time: 18.571 μs (0.00% GC) @benchmark test2(1000) median time: 1.967 μs (0.00% GC)
test1 is similar to what I’ve done in the past. I realized here that
test2 substantially faster. It appears that within the if block there is no type instability, so the dispatch is easy.
I wonder if some future optimization can make performance the same?