Я написал крошечный рекурсивный бит кода F #, чтобы узнать, сколько уровней рекурсии я могу поместить в стек под .NET/Mono. Он просто печатает глубину рекурсии всякий раз, когда она является точной мощностью 2, поэтому я обнаруживаю максимальную глубину с точностью до множителя 2.
Я запускаю код в потоке с определенным объемом пространства стека с помощью System.Threading.Thread (ThreadStart, int)
. В .Net, по-видимому, требуется примерно 100 байт на уровень рекурсии, и я могу получить около 16 миллионов уровней в стеке 2G. Использование памяти во многом аналогично использованию Mono, однако я могу получить только около 30 тысяч уровней. Увеличение значения размера стека, прошедшего до Thread
, прошло примерно около 600000
, не увеличивает глубину рекурсии.
ulimit
сообщает, что размер размера стека равен 1G.
Очевидным объяснением является то, что Mono не будет подчиняться второму аргументу Thread
, если он слишком велик. Кто-нибудь, пожалуйста, знает, как убедить Mono выделить большой стек?
Код тривиален, но он ниже на всякий случай, если кто-то заботится:
let rec f i =
if popcount i = 1 then // population count is one on exact powers of 2
printf "Got up to %d\n" i
stdout.Flush ()
if i = 1000000000 then 0 else 1 + f (i+1)