.NET/Mono のスタックに適合する再帰レベルの数を確認するために、F# コードの小さな再帰ビットを作成しました。正確に 2 の累乗である場合はいつでも再帰の深さを出力するだけなので、2 倍以内の最大の深さを見つけます。
を使用して、定義された量のスタック領域を持つスレッドでコードを開始しますSystem.Threading.Thread (ThreadStart, int)
。.Net では、再帰のレベルごとに約 100 バイトかかるようで、2G スタックで約 1600 万レベルを取得できます。メモリ使用量は Mono でほぼ同じですが、約 30,000 レベルしか取得できません。Thread
過去に渡されるスタック サイズの値を600000
増やしても、再帰の深さは増加しません。
ulimit
スタック サイズの制限が 1G であると報告します。
Thread
明白な説明は、大きすぎる場合、Mono は の 2 番目の引数に従わないということです。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)