Dot-Net
高度並行的 F# 程序顯示 CPU 使用率低
純函式式程式的承諾之一是它可以很好地並行化。我正在使用結果平庸的 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 使用率也高得多。感謝所有提出建議的人。
您應該將應用程序配置為使用伺服器垃圾收集。有關詳細資訊,請參閱gcServer元素的文件 。預設工作站垃圾收集器根本不允許分配繁重的程序擴展到多個核心。