4

根据Julia 手册的“性能提示”部分,不建议疯狂地进行多次调度。我遇到了一种情况,似乎我需要 3 个参数来定义我定义的类型。这与我关于对 2 种可能类型仅使用 1 个参数的问题有关。我意识到我可以通过简单地使用另一个参数来解决那里出现的困难,但是我的类型看起来像

type mytype{R<:Real, S<:Any, T<:Any}
   x::Matrix{R}
   y::Dict{Int64, Vector{S}}
   z::Dict{T, Vector{Int64}}
end

对于有几个要调度的参数,这在性能方面是不可取的吗?然后 mytype 上的函数将在 3 个参数上分派,函数参数是否正确?

4

2 回答 2

6

没关系。根据需要对Types执行尽可能多的调度。这就是它的用途。

你真的不想做的事情;文档的那部分内容是对值的过多调度。 您可以通过使用Value作为类型参数来执行此操作。

对值进行分派往往会出现问题,即它(通常)会导致动态分派。这意味着调用具有值作为类型参数的函数的函数不能通过知道它将调用哪个函数来专门化。这与类型不稳定性密切相关。它可以杀死很多优化器,并使 julia 像 python 一样运行缓慢。

这是我的一些代码的示例,可以说它在值调度方面“走得太远”了。它广泛使用了该Val{T}类型,该类型仅用于允许按值调度。它非常有表现力,也非常简洁,但它不会像使用条件或字典查找的相同代码那样运行得那么快。(在这种情况下,这是我愿意做出的权衡)

文档还指出,您不应该将值存储为自定义类型的类型参数。特别是如果您甚至不打算派遣他们。这就是字段的用途。

于 2016-10-28T03:31:52.880 回答
5

没关系。请注意,您可以将其写为:

type mytype{R<:Real, S, T}
   x::Matrix{R}
   y::Dict{Int64, Vector{S}}
   z::Dict{T, Vector{Int64}}
end

在大多数情况下,当您进行大量计算时,严格类型(在类型上)将有利于性能。如果您正在调用内联的小函数(在许多情况下,它会在 v0.5 中自动执行此操作,但您可以帮助它@inline),那么函数调用无论如何都没有成本,您无需担心任何事情。

与往常一样,对其进行基准测试并亲自查看。这里的问题主要来自大量的值类型。

于 2016-10-28T03:26:53.570 回答