I find that SpecialFunctions.jl’s besselk()
is ~10X slower than MATLAB’s.
In MATLAB,
>> N = 10^6; v = rand(N,1);
>> tic; for x = v; besselk(1, x); end; toc
Elapsed time is 0.017116 seconds.
>> tic; for x = v; besselk(1, x); end; toc
Elapsed time is 0.017542 seconds.
With SpecialFunctions.jl,
julia> VERSION
v"1.10.2"
(@v1.10) pkg> st SpecialFunctions
Status `~/.julia/environments/v1.10/Project.toml`
[276daf66] SpecialFunctions v2.3.1
julia> using SpecialFunctions
julia> N = 10^6; v = rand(N);
julia> @time for x = v; SpecialFunctions.besselk(1, x); end;
0.158126 seconds (5.00 M allocations: 91.545 MiB, 1.42% gc time)
julia> @time for x = v; SpecialFunctions.besselk(1, x); end;
0.173226 seconds (5.00 M allocations: 91.545 MiB, 0.56% gc time)
BesselK.jl is better than SpecialFunctions.jl, but it still does not beat MATALB:
(@v1.10) pkg> st BesselK
Status `~/.julia/environments/v1.10/Project.toml`
[432ab697] BesselK v0.5.6
julia> using BesselK
julia> @time for x = v; BesselK.besselk(1, x); end;
0.066285 seconds (4.00 M allocations: 76.286 MiB, 1.60% gc time)
julia> @time for x = v; BesselK.besselk(1, x); end;
0.065575 seconds (4.00 M allocations: 76.286 MiB, 1.62% gc time)
Is there a way to make besselk()
in Julia as fast as or faster than in MATLAB?
Another issue I found related to this is that besselk()
is slower than besselj()
in Julia, whereas it is similar in MATLAB.
In MATLAB,
>> tic; for x = v; besselj(1, x); end; toc
Elapsed time is 0.017452 seconds.
>> tic; for x = v; besselj(1, x); end; toc
Elapsed time is 0.018163 seconds.
so besselj()
at a similar speed as besselk()
.
On the other hand, in Julia,
julia> @time for x = v; SpecialFunctions.besselj(1, x); end;
0.042908 seconds (4.00 M allocations: 76.286 MiB, 2.06% gc time)
julia> @time for x = v; SpecialFunctions.besselj(1, x); end;
0.044744 seconds (4.00 M allocations: 76.286 MiB, 1.15% gc time)
so bessej()
is a lot faster than besselk()
. (Despite this speedup compared to besselk()
, SpecialFunctions.jl’s besselj()
is still slower than MATLAB’s.)