Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 对元组类型使用别名时的额外内存分配_Julia - Fatal编程技术网

Julia 对元组类型使用别名时的额外内存分配

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 结束

对于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
结束
结束
结果
结束
#热身
因为我在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))
而不是类型断言。