Open
Description
The following shows a case where the cycle detection in Serialization
takes almost all of the time. (taken from https://discourse.julialang.org/t/serialize-is-prohibitively-slow-for-recursive-structs-what-am-i-missing/76276/12)
mutable struct MinimalNode
childvalues::Union{NTuple{4, Int8}, NTuple{3, Int8}, NTuple{2, Int8}, NTuple{1, Int8}, Tuple{}};
childnodes::Union{NTuple{4, MinimalNode}, NTuple{3, MinimalNode}, NTuple{2, MinimalNode}, NTuple{1, MinimalNode}, Tuple{}};
end
function addbranches!(mn::MinimalNode, aleft::Int64, bleft::Int64, parity::Int64, depth = 0)
(depth == 12) && (return nothing);
if parity == 1
(aleft <= 1) && (return nothing);
mn.childvalues = Tuple(1:aleft);
mn.childnodes = Tuple([MinimalNode((), ()) for ii in 1:aleft]);
aleft -= 1;
else
(bleft <= 1) && (return nothing);
mn.childvalues = Tuple(1:bleft);
mn.childnodes = Tuple([MinimalNode((), ()) for ii in 1:bleft]);
bleft -= 1;
end
addbranches!.(mn.childnodes, aleft, bleft, 3-parity, depth + 1);
end
function buildfaketree()
root = MinimalNode((), ());
addbranches!(root, 4, 4, 1, 0);
return root;
end
using Serialization;
MN = [buildfaketree() for ii in 1:10000];
@time serialize("test.jls", MN);
35 seconds
Notably, increasing the size of MN
has a slightly super-linear effect on serialization time.