-
Notifications
You must be signed in to change notification settings - Fork 63
Closed
Labels
Description
If we define the simplest possible tree
using AbstractTrees
struct Tree
child :: Union{Tree, Int}
end
AbstractTrees.children(tree::Tree) = (tree.child, )
function nest(n)
tree = Tree(1)
for i in 1:n
tree = Tree(tree)
end
tree
end
function it(x)
for x in PreOrderDFS(tree)
x isa Int && return x
end
end
Then the current definition of PreOrderDFS (and other traversals) recompile for different sized trees.
julia> tree = nest(2);
julia> @time it(tree);
0.110824 seconds (297.39 k allocations: 19.659 MiB, 11.69% gc time, 99.77% compilation time)
julia> tree = nest(100);
julia> @time it(tree);
20.828098 seconds (4.94 M allocations: 329.490 MiB, 0.25% gc time, 99.96% compilation time)
Defining AbstractTrees.childtype(::Tree) = Union{Int, Tree} makes it roughly 50x faster, but there still is compile time proportional to the size of tree.