I have a newbie-type performance question.
In some of my code there is a structure that looks like this:
type FourierPoly
> periods :: Vector{Int}
> radiuses :: Vector{Float64}
> phase_offsets :: Vector{Float64}
> end
and the following two functions that operate on it:
- function polyval(f::FourierPoly, t::Float64)
> 33694968 s = zero(Complex128)
> 0 @inbounds for k = 1:length(f.periods)
> 0 s += exp(2.pi*(t + f.phase_offsets[k]) * f.periods[k] * im)
> * f.radiuses[k]
> - end
> 0 return s::Complex128
> 0 end
> 0
> 0 function polyder(f::FourierPoly, t::Float64)
> 0 s = zero(Complex128)
> 492303248 @inbounds for k = 1:length(f.periods)
> 0 θ = 2.pi * f.periods[k]
> 164100720 s += θ * im * exp((t + f.phase_offsets[k]) * θ * im) *
> f.radiuses[k]
> 257652 end
> 0 return s::Complex128
> - end
(copied from output of julia run with --track-allocation=user).
What is the difference between these two functions? polyval seems fine, but
polyder is called at most as often as polyval from the rest of the code,
yet its memory consumption is at least an order of magnitude higher? Can
somebody please point out what I'm missing here?