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})
考虑到fill(missing, n)
不会导致像FillArray
这样的优化结构,那么如何实现对单例的优化呢?我想它在某种程度上是自动地从一个零大小的单子上掉出来的,但它是如何产生的呢?
发布于 2022-01-14 15:06:51
基本的答案是对于a = Array(T)
,Julia总是分配sizeof(T)*length(a)+40
字节。因为sizeof(Missing) == 0
,这意味着它不分配任何与长度相关的字节。
索引在array.c
上进行,相关的行是
jl_value_t *r = undefref_check((jl_datatype_t*)eltype, jl_new_bits(eltype, &((char*)a->data)[i * a->elsize]))
当数组的大小为零时,a->data[i * a->elsize]
引用a->data
的开头。然而,它的内容是完全不相关的:当eltype
有零jl_datatype_size
时,jl_new_bits
忽略数据指针。,而是从eltype
返回instance
字段,这是单例对象。
https://stackoverflow.com/questions/70712573
复制相似问题