krc*_*ols 3 polymorphism performance julia
据我所知,Julia严重依赖于即时静态类型派生(基本上所有代码都需要被认为是c ++模板).我也知道这意味着在不同类型的对象上使用单个算法时只要在编译时知道这些类型就没有运行时开销.
谈到运行时多态性,我对事情的运作方式不太清楚.假设我们有以下情况:
abstract Shape
type Circle <: Shape
radius::Float64
end
type Square <: Shape
width::Float64
end
dist(x::Circle, y::Circle) = ...
dist(x::Circle, y::Square) = ...
dist(x::Square, y::Circle) = ...
dist(x::Square, y::Square) = ...
s = get_shape()
t = get_shape()
a = dist(s,t)
Run Code Online (Sandbox Code Playgroud)
这里,get_shape可以基于例如用户输入返回圆形或正方形.在c ++中,dispatch只需要进行虚拟表查找.这在朱莉娅是如何运作的?多次发送背后的机制是什么?虚拟表查找是否明显更昂贵?难道有两个获得任何好处Square,并Circle从同一个抽象类,或者这是完全不相干的在运行时调度的情况下?
EDT:在这个例子中运行@code_warntype给出:
Variables:
s::Union{Circle,Square}
t::Union{Circle,Square}
Body:
begin # none, line 2:
s = (Main.get_shape)()::Union{Circle,Square} # none, line 3:
t = (Main.get_shape)()::Union{Circle,Square} # none, line 4:
return (Main.dist)(s::Union{Circle,Square},t::Union{Circle,Square})::ASCIIString
end::ASCIIString
Run Code Online (Sandbox Code Playgroud)
所以编译器对s和t的类型并不完全无能为力.在打电话时,这些知识是否用于加快调度dist?
当您有多个相同函数的方法时,julia使用类型交集的方法查找(匹配签名中类型的参数类型)来确定要调用的方法.如果可以推断出类型,则可以在编译代码时执行该计算.通过提前查找,它不必在运行时执行类型交集,这样可以获得最佳性能.
当类型不可预测时,julia必须确定在运行时调度哪个方法.如果被调用的函数正在进行大量的工作,这有时可能是运行时的瓶颈.(当它做了很多工作时,查找对于性能来说基本上是无关紧要的).
对于julia而言,这是一个比OOP语言稍微复杂的问题,因为正确的方法取决于所有的参数,而不仅仅是第一个.
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |