在尝试在Haskell程序中添加多线程功能后,我注意到性能根本没有改善.追逐它,我从threadscope获得了以下数据:
绿色表示正在运行,橙色表示垃圾收集.
这里垂直的绿色条表示火花创建,蓝色条表示并行GC请求,浅蓝色条表示创建线程.
标签是:创建spark,请求并行GC,创建线程n,以及从第2章窃取火花.
平均而言,我只能在4个内核上获得大约25%的活动,这与单线程程序相比没有任何改进.
当然,如果没有实际程序的描述,这个问题就会无效.本质上,我创建了一个可遍历的数据结构(例如树),然后在它上面映射一个函数,然后将其提供给一个图像编写例程(在程序运行结束时解释明确的单线程段,超过15秒) .函数的构造和fmapping都需要花费大量的时间来运行,尽管第二个稍微多一点.
上图是通过在图像写入消耗之前为该数据结构添加parTraversable策略来完成的.我也尝试在数据结构上使用toList,然后使用各种并行列表策略(parList,parListChunk,parBuffer),但每次对于各种参数(甚至使用大块)的结果都相似.
我还试图在将函数映射到它之前完全评估可遍历的数据结构,但是出现了完全相同的问题.
以下是一些其他统计信息(针对同一程序的不同运行):
5,702,829,756 bytes allocated in the heap
385,998,024 bytes copied during GC
55,819,120 bytes maximum residency (8 sample(s))
1,392,044 bytes maximum slop
133 MB total memory in use (0 MB lost due to fragmentation)
Tot time (elapsed) Avg pause Max pause
Gen 0 10379 colls, 10378 par 5.20s 1.40s 0.0001s 0.0327s
Gen 1 8 colls, 8 par 1.01s 0.25s 0.0319s 0.0509s
Parallel GC work balance: 1.24 (96361163 / 77659897, ideal 4) …Run Code Online (Sandbox Code Playgroud)