# Extremely slow \`invoke\` when inlined

**URL:** <https://discourse.julialang.org/t/extremely-slow-invoke-when-inlined/90665>\
**Category:** Performance\
**Tags:** question, performance\
**Created:** [November 22, 2022, 8:16pm UTC](https://discourse.julialang.org/t/extremely-slow-invoke-when-inlined/90665 "2022-11-22T20:16:29Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![mateuszbaran](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mateuszbaran/32/221842_2.png) [@mateuszbaran](https://discourse.julialang.org/u/mateuszbaran)\
**Post date:** [November 22, 2022, 8:16pm UTC](https://discourse.julialang.org/t/extremely-slow-invoke-when-inlined/90665/1 "2022-11-22T20:16:29Z")

</div>

Consider the following code:

```julia
function e()
    els = Any[[1], 10.0]
    return rand(els)
end

function f()
    a = e()
    g(a) 
end

function g(a)
    return invoke(*, Tuple{supertype(typeof(a)),Float64}, a, 10.0)
end

```

The idea is: `g` is a very generic fallback (in the original code generated by a macro for dozens of functions), `e` is a type-unstable computation whose result can only be inferred as `Any`, and `f` combines both.  
Since `f` is type-unstable, I don’t expect great performance but the the measured time is far worse than what I would expect:

```julia
julia> using BenchmarkTools

julia> @btime f()
  260.207 μs (351 allocations: 19.44 KiB)
1-element Vector{Float64}:
 10.0

```

It can be demonstrated that Julia decided to inline `g`, which was a very bad decision. After marking it as `@noinline` the performance is reasonable:

```julia
julia> @btime f()
  72.831 ns (6 allocations: 244 bytes)
1-element Vector{Float64}:
 10.0

```

So, about 3600x faster (I’m using Julia 1.8.1).  
Now my question is: is there any way to fix this performance issue other than marking `g` as `@noinline`? It is perfectly fine to inline `g` into type-stable functions, it can even improve performance a little in some cases.

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [November 22, 2022, 8:38pm UTC](https://discourse.julialang.org/t/extremely-slow-invoke-when-inlined/90665/2 "2022-11-22T20:38:23Z")

</div>

Good find! Julia’s cost model really shouldn’t be trying to inline this.

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [November 22, 2022, 8:56pm UTC](https://discourse.julialang.org/t/extremely-slow-invoke-when-inlined/90665/3 "2022-11-22T20:56:08Z")

</div>

[improve inlining cost analysis for invoke by oscardssmith · Pull Request #47671 · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/pull/47671) fixes it.

---

<div class="post-metadata">

**Author:** ![mateuszbaran](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mateuszbaran/32/221842_2.png) [@mateuszbaran](https://discourse.julialang.org/u/mateuszbaran)\
**Post date:** [November 22, 2022, 9:00pm UTC](https://discourse.julialang.org/t/extremely-slow-invoke-when-inlined/90665/4 "2022-11-22T21:00:50Z")

</div>

Thanks, that’s a very quick response and a PR 🙂 .
