Julia 对元组类型使用别名时的额外内存分配
对于Julia 1.5.3,我有以下代码(当然它不是实际代码,只是一个我可以重新编程的人为示例):Julia 对元组类型使用别名时的额外内存分配,julia,Julia,对于Julia 1.5.3,我有以下代码(当然它不是实际代码,只是一个我可以重新编程的人为示例): function basic() 结果::元组{Int64,Int64,Int64}=(0,0,0) 因为我是1:100000 对于i in-1:1,j in-1:1,k in-1:1 结果=结果+(i,j,k) 结束 结束 结果 结束 函数(T) 结果::T=(0,0,0) 因为我是1:100000 对于i in-1:1,j in-1:1,k in-1:1 结果=结果+(i,j,k)::T 结束
function basic()
结果::元组{Int64,Int64,Int64}=(0,0,0)
因为我是1:100000
对于i in-1:1,j in-1:1,k in-1:1
结果=结果+(i,j,k)
结束
结束
结果
结束
函数(T)
结果::T=(0,0,0)
因为我是1:100000
对于i in-1:1,j in-1:1,k in-1:1
结果=结果+(i,j,k)::T
结束
结束
结果
结束
#热身
因为我在1:10
基本()
花式(元组{Int64,Int64,Int64})
结束
println(“基本:”)
println(@time basic())
println(“花式:”)
println(@timefancy(元组{Int64,Int64,Int64}))
产出:
basic:
0.000000 seconds
(0, 0, 0)
fancy:
0.762599 seconds (10.80 M allocations: 494.385 MiB, 3.68% gc time)
(0, 0, 0)
如果我改写:
result=result.+(i,j,k)::T
我得到:
basic:
0.000000 seconds
(0, 0, 0)
fancy:
0.789512 seconds (13.50 M allocations: 576.782 MiB, 3.77% gc time)
(0, 0, 0)
有没有办法让basic
和fancy
执行相同的操作,即在fancy
中没有分配
function fancy(T)
result = T((0, 0, 0))
for i in 1:100000
for i in -1:1, j in -1:1, k in -1:1
result = result .+ T((i, j, k))
end
end
result
end
只需更改
fancy
的签名:
function fancy(::Type{T}) where T
result::T = (0, 0, 0)
for i in 1:100000
for i in -1:1, j in -1:1, k in -1:1
result = result .+ (i, j, k)::T
end
end
result
end
println(@time fancy(Tuple{Int64,Int64,Int64}))
<>请注意,这两个函数实际上都被优化到了ALMOST-NO-OP。您可以使用<代码> @ CODEL本地基元()/代码>来检查它。您也可以考虑使用<代码> SVector <代码> >代码> StasCARLIEX<代码>。谢谢,这是有意义的。可以肯定的是,
fancy(::Type{T})其中T
意味着我们接受一个类型的参数,并且该类型被参数化为T。所以现在我很好奇在我的问题中代码做了什么:函数fancy(T)result::T=(0,0,0).
那么T是什么?嗯,在我的问题中T
是Any
类型的参数。那么,result::T
是什么意思呢?我猜那是作业时间的动态类型检查?是的。实际上,它更像是result=convert(T,(0,0,0))
而不是类型断言。