纯函数式编程的一个承诺是它很好地并行化。我正在使用具有平庸结果的F#应用程序测试此声明。我的程序通过Array.Parallel并行运行大量的MiniMax搜索。 MiniMax算法是纯粹的功能代码 - 没有共享状态,没有锁定,但是高度递归,在搜索树时会创建和销毁大量值。根本就没有I / O--一切都在内存中。每个MiniMax搜索需要5-60秒,我在一个带有8个CPU内核的快速盒子上并行运行大约100个。可悲的是,CPU利用率达到65%左右,通常在45-60%的范围内。
我使用Visual Studio Concurrency Visualizer分析了我的应用程序,发现它在大约40%的时间内被阻止。所有阻塞调用似乎都在.NET垃圾收集器或其他.NET内存管理例程中。有没有办法优化这种行为,而无需用C ++等低级语言重写整个程序?很明显,问题在于我正在创建和销毁太多的对象,但这在惯用的F#代码中很难避免。也许我错过了同步问题的其他一些原因?
感谢。
更新:我做了两处更改:禁用超线程并在配置文件中使用gcServer。这使我的测试用例的执行时间从32秒减少到13秒! CPU利用率也高得多。感谢所有提出建议的人。