我试图测试parallel
包,特别是par
函数。我写了一个简单的程序来测试并行性是否会加速其他顺序程序。
所以在这里我写了两个脚本,第一个顺序:
import Control.Parallel
n = 600000000
main = print $ pseq (mod (sum [1..n]) 5) (mod (sum [1..n]) 5)
第二个并行:
import Control.Parallel
n = 600000000
main = print $ par (mod (sum [1..n]) 5) (mod (sum [1..n]) 5)
我使用ghc -O2
编译每个并运行它们,然后使用GNU time
测量运行时间。这是我得到的:
依序:
User time (seconds): 13.79
System time (seconds): 0.04
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:13.85
并行:
User time (seconds): 6.89
System time (seconds): 0.05
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:06.97
这很有趣但令人困惑:为什么并行版本的速度要快两倍,但只使用一个核心?
答案 0 :(得分:8)
为什么它只使用一个核心?
因为您使用了非线程运行时。使用-threaded
进行编译以利用花哨的新线程运行时。但是由于第二个问题的答案,这不会帮助你实现这个微基准测试:你只编写了一个核心的计算值。
为什么它变得更快?
因为它计算的东西较少:因为par
的第一个参数永远不会被第二个参数使用,所以它会被塞进一个永远不会被要求的火花中,因此永远不会被迫做它的工作。另一方面,pseq
总是完成第一个参数所需的工作,即使该值未被其第二个参数使用。