Я написал крошечный рекурсивный бит кода 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)
