Could you file this as an issue? -viral
> On 26-Feb-2015, at 10:44 am, DumpsterDoofus <[email protected]> > wrote: > > Thanks for the tip. Unfortunately, @evalpoly seems to be orders of magnitude > slower for some reason, and has huge memory allocation compared to @horner. > Here is an example: > import Base.Math.@horner > function SchroderFifthHorner(a0::Float64, a1::Float64, a2::Float64, > a3::Float64, a4::Float64, a5::Float64, c::Complex{Float64}) > x = c > M = 100 > d = 10.0^-6 > a = 0.1 > for j in 1:M > xP = x > f = @horner(x,a0,a1,a2,a3,a4,a5) > fP = @horner(x,a1,2*a2,3*a3,4*a4,5*a5) > fPP = @horner(x,2*a2,6*a3,12*a4,20*a5) > x -= f*fP/(fP^2 - f*fPP) > if abs(x - xP) < d > return exp(-a*(j - (log(abs(x - xP)) - log(d))/log(d)) > + angle(x)im) > end > end > return 0.0im > end > function SchroderFifthEvalPoly(a0::Float64, a1::Float64, a2::Float64, > a3::Float64, a4::Float64, a5::Float64, c::Complex{Float64}) > x = c > M = 100 > d = 10.0^-6 > a = 0.1 > for j in 1:M > xP = x > f = @evalpoly(x,a0,a1,a2,a3,a4,a5) > fP = @evalpoly(x,a1,2*a2,3*a3,4*a4,5*a5) > fPP = @evalpoly(x,2*a2,6*a3,12*a4,20*a5) > x -= f*fP/(fP^2 - f*fPP) > if abs(x - xP) < d > return exp(-a*(j - (log(abs(x - xP)) - log(d))/log(d)) > + angle(x)im) > end > end > return 0.0im > end > > @time arr1 = [SchroderFifthHorner(1.0,0.0,0.0,0.0,0.0,6.0,x+y*im) for x in > linspace(-1,1,200), y in linspace(-1,1,200)]; > @time arr2 = [SchroderFifthEvalPoly(1.0,2.0,3.0,4.0,5.0,6.0,x+y*im) for x in > linspace(-1,1,200), y in linspace(-1,1,200)]; > Same exact code, but @horner is replaced with @evalpoly in the second > function. On my laptop, the @horner method returns 0.040350402 seconds > (644144 bytes allocated), whereas the @evalpoly method returns 5.265075967 > seconds (2164451728 bytes allocated). The result of the @evalpoly method does > not appear to be type-stable, since arr2 is of type Array{Any, 2}. I'm not > sure why the instability arises, though. >
