Control.Parallel
模块,但我认为我的理解不正确。我尝试运行以下代码(fibs.hs)。
import Control.Parallel
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = p `par` (q `pseq` (p + q))
where
p = fib (n-1)
q = fib (n-2)
main = print $ fib 30
我使用以下内容进行编译:
ghc -O2 --make -threaded fibs.hs
接着我执行了这个程序并得到以下结果(一个运行Python脚本100次并返回平均执行时间和标准差的输出):
./fibs +RTS -N1 -> avg= 0.060203 s, deviation = 0.004112 s
./fibs +RTS -N2 -> avg= 0.052335 s, deviation = 0.006713 s
./fibs +RTS -N3 -> avg= 0.052935 s, deviation = 0.006183 s
./fibs +RTS -N4 -> avg= 0.053976 s, deviation = 0.007106 s
./fibs +RTS -N5 -> avg= 0.055227 s, deviation = 0.008598 s
./fibs +RTS -N6 -> avg= 0.055703 s, deviation = 0.006537 s
./fibs +RTS -N7 -> avg= 0.058327 s, deviation = 0.007526 s
我的问题如下:
当我执行以下操作时,究竟会发生什么:
a `par` (b `pseq` (a + b)) ?
我知道
par
a b表示提示编译器在计算a和b的时候并行处理a,最后返回b。好,但是pseq
是干什么的呢?为什么性能提升这么小?我在一台Intel Core 2 Quad机器上运行这个程序。我希望使用-N5或-N6不会对性能产生实质性影响,或者程序会表现得非常糟糕。但是为什么从-N2到-N3没有任何改善,而最初的改善如此之小?