我运行julia --track-allocation prof.jl导致以下输出:
- using FixedSizeArrays
-
- immutable KernelVals{T}
- wavenumber::T
- vect::Vec{3,T}
- dist::T
- green::Complex{T}
- gradgreen::Vec{3,Complex{T}}
- end
-
- function kernelvals(k, x, y)
- r = x - y
0 R2 = r[1]*r[1]
0 R2 += r[2]*r[2]
0 R2 += r[3]*r[3]
0 R = sqrt(R2)
-
0 ? = im*k
0 expn = exp(-? * R)
0 fctr = 1.0 / (4.0*pi*R)
0 green = fctr * expn
64 gradgreen = -(? + …Run Code Online (Sandbox Code Playgroud) 我想在FixedSizeArrays.Vec {N,T}周围定义一个类型,其中N是type参数的函数:
using FixedSizeArrays
type MT{N}
x::Vec{N,Int}
y::Vec{N+1,Int}
end
Run Code Online (Sandbox Code Playgroud)
这会导致错误消息:
ERROR: MethodError: `+` has no method matching +(::TypeVar, ::Int64)
Closest candidates are:
+(::Any, ::Any, ::Any, ::Any...)
+(::Int64, ::Int64)
+(::Complex{Bool}, ::Real)
...
Run Code Online (Sandbox Code Playgroud)
显然,即使在编译时可以知道结果,也不允许使用整数类型参数进行简单算术.有没有人知道这个限制的解决方法?
据我所知,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 ×3
allocation ×1
optimization ×1
performance ×1
polymorphism ×1
profiling ×1
templates ×1