PSeq线程(或System.Linq.ParallelEnumerable使用的线程)的堆栈深度

时间:2014-08-19 17:46:02

标签: .net linq f#

我需要使用非常深的堆栈运行一些F#代码。这是因为Mono的理念是删除尾部调用是一种优化,因此并不总是需要工作。

我可以启动一个包含大量堆栈空间的线程,一切正常,直到我使用PSeq,它是System.Linq.ParallelEnumerable的包装器。然后一切都因堆栈溢出而死亡。我希望原因是PSeq依赖于线程使用默认堆栈大小的全局线程池。

有人可以告诉我是否有任何方法可以让PSeq使用大堆栈?非常感谢。

1 个答案:

答案 0 :(得分:0)

显然,您可以使用editbin更改可执行文件的默认堆栈大小。请参阅How to change stack size for a .NET program?

但请注意,许多F#尾调用都是由编译器重写的,因此运行时的作用并不重要。例如,这是F#中的函数:

let rec zeroPresent =
    function
    | [] -> false
    | h :: t -> h = 0 || zeroPresent t

在这里它被反编译为C#。请注意while (true)

public static bool zeroPresent(FSharpList<int> _arg1)
{
    while (true)
    {
        FSharpList<int> fsharpList1 = _arg1;
        if (fsharpList1.get_TailOrNull() != null)
        {
            FSharpList<int> fsharpList2 = fsharpList1;

            FSharpList<int> tailOrNull = fsharpList2.get_TailOrNull();

            if (fsharpList2.get_HeadOrDefault() != 0)
                _arg1 = tailOrNull;
            else
                goto label_3;
        }
        else
            break;
    }
    return false;
label_3:
    return true;
}