phi*_*ler 7 arrays runtime julia
Vector{Missing}和之间的以下差异Vector{Int}让我感到惊讶(以积极的方式):
julia> @btime fill(20, 10^7);
15.980 ms (2 allocations: 76.29 MiB)
julia> @btime fill(missing, 10^7);
20.603 ns (1 allocation: 80 bytes)
julia> Base.summarysize(fill(20, 10^7))
80000040
julia> Base.summarysize(fill(missing, 10^7))
40
julia> typeof(fill(20, 10^7))
Vector{Int64} (alias for Array{Int64, 1})
julia> typeof(fill(missing, 10^7))
Vector{Missing} (alias for Array{Missing, 1})
Run Code Online (Sandbox Code Playgroud)
鉴于这fill(missing, n)不会产生像 那样的优化结构FillArray,那么这种对单例的优化是如何实现的呢?我猜想它会以某种方式自动从单例大小为零的事实中消失,但是如何呢?
基本答案是a = Array(T)Julia 总是分配sizeof(T)*length(a)+40字节。由于sizeof(Missing) == 0,这意味着它不会分配与长度相关的任何字节。
索引发生在 的第 569 行array.c,相关行是
jl_value_t *r = undefref_check((jl_datatype_t*)eltype, jl_new_bits(eltype, &((char*)a->data)[i * a->elsize]))
Run Code Online (Sandbox Code Playgroud)
当数组大小为零时,a->data[i * a->elsize]引用 的开头a->data。然而,它的内容是完全无关的:当eltypehas 0时jl_datatype_size,jl_new_bits 忽略数据指针,而是instance从 中返回字段eltype,这是单例对象。