The way I read Hierarchy, it looks like Silverstripe first tries to mark at least 30 pages for loading. It starts by traveling the first level, then al pages on the second, then the third, untill all or at least 30 pagenodes are collected - or even more, since it doesn't stop halfway between sibblings. Depending on how a site is build, only the first two levels could be marked, but it could also include say two submenus on the third level or even go up into the fourth.
For each page marked, SilverStripe finds out if it has children, cause then it needs an 'expanded' icon. All marked pages are loaded first, all others via ajax on request.
So I was thinking, theoretically, if you'd set the nr of pages to mark to say 2 or 3, instead of 30, only the first complete level would be preloaded. It would then of course take an Ajax call for each and every submenu.
I have, of course,no idea of any other implications, but I'd sure like to know what happens on a large (test!!!) site... I did try 850 pages, but on my server they load really fast anyway... Could it be a way of balancing the load? Find the $minCount param in Hierarchy method markPartialTree().
In 2.4beta1 there are a couple of changes to the procedure...