# \`sort!()\` and \`sort()\` give me runtime dispatches

**URL:** <https://discourse.julialang.org/t/sort-and-sort-give-me-runtime-dispatches/82715>\
**Category:** Performance\
**Created:** [June 14, 2022, 12:27am UTC](https://discourse.julialang.org/t/sort-and-sort-give-me-runtime-dispatches/82715 "2022-06-14T00:27:13Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![maxkapur](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maxkapur/32/21208_2.png) [@maxkapur](https://discourse.julialang.org/u/maxkapur)\
**Post date:** [June 14, 2022, 12:27am UTC](https://discourse.julialang.org/t/sort-and-sort-give-me-runtime-dispatches/82715/1 "2022-06-14T00:27:13Z")

</div>

I have been learning how to use JET.jl to check my code for type instabilities, and I notice that it keeps giving me a runtime dispatch after calling Julia’s built-iin sort routines. This happens even when my functions have fairly heavy type annotations, for example:

```julia
function makevector(n::Integer)::Vector{Int}
    rand(1:50, n)
end

function samplemedian_inplace(n::Integer)
    v = makevector(n)
    sort!(v)
    v[length(v)÷2]
end

function samplemedian_outofplace(n::Integer)
    v = makevector(n) |> sort
    v[length(v)÷2]
end

```

JET.jl says:

```julia
julia> using JET

julia> @report_opt samplemedian_inplace(200)
═════ 1 possible error found ═════
┌ @ /home/max/OptimalApplication.jl/sandbox2.jl:9 Main.sort!(v)
│┌ @ sort.jl:714 Base.Sort.#sort!#8(Base.Sort.defalg(v), Base.Sort.isless, Base.Sort.identity, Base.Sort.nothing, Base.Sort.Forward, #self#, v)
││┌ @ sort.jl:718 Base.Sort.extrema(v)
│││┌ @ reducedim.jl:994 Base.#extrema#782(Base.:, Base.pairs(Core.NamedTuple()), #self#, a)
││││┌ @ reducedim.jl:994 Base._extrema(a, dims)
│││││┌ @ reducedim.jl:998 Base.#_extrema#784(Base.pairs(Core.NamedTuple()), #self#, a, _3)
││││││┌ @ reducedim.jl:998 Base._extrema(Base.identity, a, Base.:)
│││││││┌ @ reducedim.jl:999 Base.#_extrema#785(Base.pairs(Core.NamedTuple()), #self#, f, a, _4)
││││││││┌ @ reducedim.jl:999 Base.mapreduce(Base.ExtremaMap(f), Base._extrema_rf, a)
│││││││││┌ @ reducedim.jl:357 Base.#mapreduce#759(Base.:, Base._InitialValue(), #self#, f, op, A)
││││││││││┌ @ reducedim.jl:357 Base._mapreduce_dim(f, op, init, A, dims)
│││││││││││┌ @ reducedim.jl:365 Base._mapreduce(f, op, Base.IndexStyle(A), A)
││││││││││││┌ @ reduce.jl:419 Base.mapreduce_empty_iter(f, op, A, Base.IteratorEltype(A))
│││││││││││││┌ @ reduce.jl:367 Base.reduce_empty_iter(Base.MappingRF(f, op), itr, ItrEltype)
││││││││││││││┌ @ reduce.jl:371 Base.reduce_empty(op, Base.eltype(itr))
│││││││││││││││┌ @ reduce.jl:348 Base.mapreduce_empty(ExtremaMap{typeof(identity)}(identity), _extrema_rf, _)
││││││││││││││││ runtime dispatch detected: Base.mapreduce_empty(ExtremaMap{typeof(identity)}(identity), _extrema_rf, _::Type{Int64})
│││││││││││││││└─────────────────

julia> @report_opt samplemedian_outofplace(200)
═════ 1 possible error found ═════
┌ @ /home/max/OptimalApplication.jl/sandbox2.jl:14 v = Main.|>(Main.makevector(n), Main.sort)
│┌ @ operators.jl:911 f(x)
││┌ @ sort.jl:773 Base.Sort.#sort#9(Base.pairs(Core.NamedTuple()), #self#, v)
│││┌ @ sort.jl:773 Base.Sort.sort!(Base.Sort.copymutable(v))
││││┌ @ sort.jl:714 Base.Sort.#sort!#8(Base.Sort.defalg(v), Base.Sort.isless, Base.Sort.identity, Base.Sort.nothing, Base.Sort.Forward, #self#, v)
│││││┌ @ sort.jl:718 Base.Sort.extrema(v)
││││││┌ @ reducedim.jl:994 Base.#extrema#782(Base.:, Base.pairs(Core.NamedTuple()), #self#, a)
│││││││┌ @ reducedim.jl:994 Base._extrema(a, dims)
││││││││┌ @ reducedim.jl:998 Base.#_extrema#784(Base.pairs(Core.NamedTuple()), #self#, a, _3)
│││││││││┌ @ reducedim.jl:998 Base._extrema(Base.identity, a, Base.:)
││││││││││┌ @ reducedim.jl:999 Base.#_extrema#785(Base.pairs(Core.NamedTuple()), #self#, f, a, _4)
│││││││││││┌ @ reducedim.jl:999 Base.mapreduce(Base.ExtremaMap(f), Base._extrema_rf, a)
││││││││││││┌ @ reducedim.jl:357 Base.#mapreduce#759(Base.:, Base._InitialValue(), #self#, f, op, A)
│││││││││││││┌ @ reducedim.jl:357 Base._mapreduce_dim(f, op, init, A, dims)
││││││││││││││┌ @ reducedim.jl:365 Base._mapreduce(f, op, Base.IndexStyle(A), A)
│││││││││││││││┌ @ reduce.jl:419 Base.mapreduce_empty_iter(f, op, A, Base.IteratorEltype(A))
││││││││││││││││┌ @ reduce.jl:367 Base.reduce_empty_iter(Base.MappingRF(f, op), itr, ItrEltype)
│││││││││││││││││┌ @ reduce.jl:371 Base.reduce_empty(op, Base.eltype(itr))
││││││││││││││││││┌ @ reduce.jl:348 Base.mapreduce_empty(ExtremaMap{typeof(identity)}(identity), _extrema_rf, _)
│││││││││││││││││││ runtime dispatch detected: Base.mapreduce_empty(ExtremaMap{typeof(identity)}(identity), _extrema_rf, _::Type{Int64})
││││││││││││││││││└───────────────── 

```

Is there a way to prevent this runtime dispatch? Is it worth doing so?

(This is Julia v1.8.0-beta1.)

---

<div class="post-metadata">

**Author:** ![N5N3](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/n5n3/32/17663_2.png) [@N5N3](https://discourse.julialang.org/u/N5N3)\
**Post date:** [June 15, 2022, 2:21pm UTC](https://discourse.julialang.org/t/sort-and-sort-give-me-runtime-dispatches/82715/2 "2022-06-15T14:21:48Z")

</div>

This branch just shows that `extrema` is not defined for empty `Vector{Int}`. Since it’s on error path, it should not harm runtime performance.
