When I only add the Function parameters to the Define type, I get basically 0% to 10% improvement.
My original timings look like this
julia> newton(:(z^3-1);n=500)|>fatou;
0.240635 seconds (1.69 M allocations: 58.407 MiB)
With the Define{FT<:Function,QT<:Function,CT<:Function} definition, I don’t get much improvement
julia> newton(:(z^3-1);n=500)|>fatou;
0.221504 seconds (1.53 M allocations: 50.724 MiB)
However, because in my situation there is additional program logic, I added additional Bool type paramters to the Fatou.Define{FT,QT,CT,M,N} object, which gave me a 10x performance improvement. This time the parameters have additionally Bool pair to help decide on Mandelbrot and Newton fractal mode.
julia> newton(:(z^3-1);n=500)|>fatou;
0.020936 seconds (542 allocations: 36.784 KiB)
This is because of my iteration function definition, which depends on these true or false values, by including them in the Fatou.Define type parameters, the function can specialize on those values
# define function for computing orbit of a z0 input
function nf(K::Define{FT,QT,CT,M,N},z0::Complex{Float64}) where {FT,QT,CT,M,N}
M ? (z = K.seed) : (z = z0)
zn = 0x00
while (N ? (K.Q(z,z0)::Float64>K.ϵ)::Bool : (K.Q(z,z0)::Float64<K.ϵ))::Bool && K.N>zn
z = K.F(z,z0)::Complex{Float64}
zn+=0x01
end; #end
# return the normalized argument of z or iteration count
return (zn::UInt8,z::Complex{Float64})
end
So now it computes much, much faster. However, in my case, having a Function parameter alone did not do the trick, it was also necessary to have other parameters also.
Sprechen sie Deutsch?