经常听到动态多分派性能很差的话语,甚至ValSplit.jl
专门把Val
类型的分派变为 if else
以提升性能,但我不晓得为什么说动态多分派性能很差,而且我还经常用到动态多分派。
如以下会触发动态多分派的代码:
function f()
a, b = take_two_types()
dispatch(a, b)
end
dispatch(::Int, ::Int) = "Int - Int"
dispatch(::Int, ::Float16) = "Int - Float16"
dispatch(::Int, ::Float64) = "Int - Float64"
# ... more
这里面 a
和 b
的类型只有在运行时才能知道,因此用哪个 dispatch
函数得在运行时才能决定,这样性能会很差么?我是否需要改用模式匹配
或者if else
以提升性能?
不论是 C++
的虚函数还是 Rust
的 dyn Trait
都是可应对动态分派的情况,为什么在 Julia
里就要强调动态分派性能很差呢?难道是动态多分派性能很差?
又如社区经常会举的「类型不稳定」的例子:
function test()
x = rand(Bool) ? 1 : 2.0 # type-unstable!!!
process(x)
end
process(::Float64) = "..."
process(::Int) = "..........."
如果这样性能也很差,那在 REPL
做个加减法岂不是性能也非常差?毕竟 REPL
不可能预测我会把什么拿过来做个加法,我可以 +(1, 2)
也可以 +(1.0, 2)
好像也没人说这样子很差呀,所以动态多分派性能差在哪儿呢?