当前位置 : 主页 > 网络安全 > 测试自动化 >

fun(n :: Integer)和fun(n :: T)之间有区别吗?其中T <:整数在性能/代码生成中?

来源:互联网 收集:自由互联 发布时间:2021-06-22
在Julia中,我经常看到代码写成fun(n :: T),其中T:Integer,当函数适用于Integer的所有子类型时.但有时,我也看到有趣(n :: Integer),一些指南声称它等同于上述,而其他人说它效率较低,因为Julia并不
在Julia中,我经常看到代码写成fun(n :: T),其中T<:Integer,当函数适用于Integer的所有子类型时.但有时,我也看到有趣(n :: Integer),一些指南声称它等同于上述,而其他人说它效率较低,因为Julia并不专注于特定的子类型,除非明确提到子类型T. 后一种形式显然更方便,如果可能,我希望能够使用它,但这两种形式是否相同?如果没有,它们之间的实际差异是什么? 两个定义都是等价的.通常,您将使用fun(n :: Integer)表单并应用fun(n :: T),其中T<:Integer仅在您需要在代码中直接使用特定类型T时才应用.例如,考虑Base中的以下定义(所有以下定义也来自Base),它具有自然用途:

zero(::Type{T}) where {T<:Number} = convert(T,0)

要么

(+)(x::T, y::T) where {T<:BitInteger} = add_int(x, y)

即使您在许多情况下需要类型信息,也足以使用typeof函数.再一个示例定义是:

oftype(x, y) = convert(typeof(x), y)

即使您使用的是参数类型,也可以避免使用where子句(有点冗长),如:

median(r::AbstractRange{<:Real}) = mean(r)

因为你不关心函数体中参数的实际值.

现在 – 如果你是像我这样的朱莉娅用户 – 问题是如何说服自己这是按预期工作的.有以下方法:

>您可以检查一个定义是否覆盖方法表中的另一个定义(即在评估两个定义之后,此函数只存在一个方法);
>您可以使用@code_typed,@ code_warntype,@ code_llvm或@code_native等检查两个函数生成的代码,并发现它是相同的
>最后,您可以使用BenchmarkTools对性能代码进行基准测试

一个很好的情节解释Julia对你的代码做了什么在这里http://slides.com/valentinchuravy/julia-parallelism#/1/1(我也向所有Julia用户推荐整个演示文稿 – 它非常棒).并且您可以看到,在降低AST之后,Julia应用类型推断步骤来专门化LLVM codegen步骤之前的函数调用.

您可以提示Julia编译器以避免专门化.这是使用Julia 0.7上的@nospecialize宏完成的(虽然这只是一个提示).

网友评论