Performance improvements - #24
Conversation
findlast does not necessarily return an Integer, it may also return
Nothing, depending on the value of its arguments.
The latter case needs to be handled to prevent run-time dispatch for
the slicing operation.
Additionally, the truncated coefficients slice is now a view
instead of a copy. This should make things slightly more performant,
apart from making the code simpler.
JET warnings before this commit:
```
julia> @report_opt PolynomialRoots.roots(rand(5))
═════ 1 possible error found ═════
┌ @ /home/nsajko/.julia/packages/PolynomialRoots/1iZQh/src/PolynomialRoots.jl:610 PolynomialRoots.:(var"#roots#2")(PolynomialRoots.NaN, false, #self#, poly)
│┌ @ /home/nsajko/.julia/packages/PolynomialRoots/1iZQh/src/PolynomialRoots.jl:617 1 PolynomialRoots.:(:) %28
││ runtime dispatch detected: (1 PolynomialRoots.:(:) %28::Union{Nothing, Int64})::UnitRange{Int64}
│└─────────────────────────────────────────────────────────────────────────────────
```
After this commit:
```
julia> using JET, PolynomialRoots
julia> PolynomialRoots.roots(rand(5))
4-element Vector{ComplexF64}:
-31.46526111710419 - 1.6981590262940853e-16im
-0.13020601478750077 - 0.8162149121849699im
-0.13020601478750077 + 0.81621491218497im
-0.48806837350069937 + 2.350988701644575e-38im
julia> @report_opt PolynomialRoots.roots(rand(5))
No errors detected
```
|
Do you have any benchmarks? Tests are failing, I'd be OK with requiring a newer version of Julia if that helps, but tests are failing also on nightly (haven't checked why) |
|
The failing tests are for I can do some benchmarking if you want. JET still shows the same warning on Julia nightly, though, so this change still fixes the run time dispatch. |
|
Regarding the tests that fail for Julia 1.0: the reason seems to be the The |
Tests are failing on nightly independently of this PR. It looks like the result of PolynomialRoots.jl/test/runtests.jl Lines 163 to 164 in ccc2222 PolynomialRoots.jl/test/runtests.jl Lines 182 to 183 in ccc2222 |
Prevents run-time dispatch in the most basic
PolynomialRoots.rootsmethod.