【发布时间】:2013-11-18 00:38:57
【问题描述】:
我编写了一小段递归 F# 代码,以查看在 .NET/Mono 下我可以将多少级递归放入堆栈中。只要递归深度是 2 的精确幂,它就会打印递归深度,因此我会找出最大深度在 2 倍以内。
我使用System.Threading.Thread (ThreadStart, int) 在具有已定义堆栈空间量的线程中启动代码。在 .Net 下,每级递归似乎需要大约 100 个字节,而我可以在 2G 堆栈上获得大约 1600 万级。 Mono 下的内存使用大致相似,但是我只能获得大约 30,000 个级别。将传递给Thread 的堆栈大小值增加超过大约600000 不会增加递归深度。
ulimit 报告堆栈大小限制为 1G。
一个明显的解释是,如果 Thread 的第二个参数太大,Mono 将不会服从它。请问有人知道如何说服 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)
【问题讨论】:
-
仅供参考,默认 .NET 应用程序堆栈大小为 1 MB。见Stack capacity in C#。还有详细的article on changing stack size的链接。