Performance fun(n::Integer)和fun(n::T)之间是否有区别,其中T<;:性能/代码生成中的整数?

Performance fun(n::Integer)和fun(n::T)之间是否有区别,其中T<;:性能/代码生成中的整数?,performance,julia,multiple-dispatch,Performance,Julia,Multiple Dispatch,在Julia中,我经常看到像fun(n::T)这样编写的代码,其中TYes在他的评论中是正确的:f(n::T),其中T两个定义是等价的。通常,您将使用fun(n::Integer)form,并将fun(n::T)应用于TAFAIK等价的地方。我知道的建议是使用fun(n::Integer),除非您需要T函数体中的某个地方。这正是f(x::Number,y::Number)示例中的建议。您可以看到,如果您同时运行这两个定义,那么如果您检查方法的fun,它们会相互覆盖。您还可以通过传递不同类型的参数

在Julia中,我经常看到像
fun(n::T)这样编写的代码,其中TYes在他的评论中是正确的:
f(n::T),其中T两个定义是等价的。通常,您将使用
fun(n::Integer)
form,并将
fun(n::T)应用于TAFAIK等价的地方。我知道的建议是使用
fun(n::Integer)
,除非您需要
T
函数体中的某个地方。这正是
f(x::Number,y::Number)
示例中的建议。您可以看到,如果您同时运行这两个定义,那么如果您检查方法的
fun
,它们会相互覆盖。您还可以通过传递不同类型的参数来检查这两个表单是否生成了与
@code\u warntype
@code\u native
完全相同的代码。它们似乎生成了相同的代码,我现在看到Julia source中的代码仅在定义中或签名的另一部分中使用子类型时才使用
T
,例如
(x::T,y::T)
,否则它们直接使用超类型。如果签名中只提到了超类型,那么Julia的编译器尽管聪明,却不会费心生成特定于子类型的代码,这是一个有点疯狂的想法——我相信是某个Youtube初学者教程提到了它,我很高兴这不是真的。你能补充你的评论作为回答吗?只是碰巧,我发现这一点得到了进一步的证实:他自己认为“这些完全相同”。现在Julia足够聪明,可以用第二个定义替换第一个定义,所以
f
最后只有一个方法。
zero(::Type{T}) where {T<:Number} = convert(T,0)
(+)(x::T, y::T) where {T<:BitInteger} = add_int(x, y)
oftype(x, y) = convert(typeof(x), y)
median(r::AbstractRange{<:Real}) = mean(r)