Another feature of ArrayAllocators.jl v0.3 is an alternate implementation of zeros
via calloc
. Note that this ArrayAllocators.zeros
is not exported. Here ArrayAllocators.zeros(T, ...)
is essentially just Array{T}(calloc, ...)
.
julia> using ArrayAllocators
julia> @time AAZ = ArrayAllocators.zeros(Int, 1024, 1024, 1024);
0.029364 seconds (61.31 k allocations: 8.004 GiB, 99.89% compilation time)
julia> @time AAZ = ArrayAllocators.zeros(Int, 1024, 1024, 1024);
0.000037 seconds (4 allocations: 8.000 GiB)
julia> @time BZ = Base.zeros(Int, 1024, 1024, 1024);
4.448959 seconds (2 allocations: 8.000 GiB, 0.52% gc time)
julia> @time BZ = Base.zeros(Int, 1024, 1024, 1024);
4.665584 seconds (2 allocations: 8.000 GiB, 2.48% gc time)
Note that on some operating systems this may defer the actual allocation of memory until writing.
julia> @time fill!(AAZ, 1)
4.849603 seconds (8.17 k allocations: 491.429 KiB, 0.64% compilation time)
julia> @time fill!(AAZ, 2);
1.634943 seconds
julia> @time fill!(BZ, 1);
1.710879 seconds
julia> @time fill!(BZ, 2);
1.717882 seconds
If you wanted to switch your code to use ArrayAllocators.zeros
instead of Base.zeros
, you can import it before your first reference to zeros
.
julia> using ArrayAllocators: zeros
julia> @time zeros(Int, 1024, 1024, 1024);
0.000028 seconds (4 allocations: 8.000 GiB)
julia> @time Base.zeros(Int, 1024, 1024, 1024);
4.442414 seconds (2 allocations: 8.000 GiB, 0.10% gc time)
While this may look like a free lunch, note @Sukera’s caveats in the original post: