gpt4 book ai didi

haskell - Word foldl' 没有像 Int foldl' 那样优化

转载 作者:行者123 更新时间:2023-12-03 15:28:28 24 4
gpt4 key购买 nike

import Data.List

test :: Int -> Int
test n = foldl' (+) 0 [1..n]

main :: IO ()
main = do
print $ test $ 10^8

GHC 将上面的代码优化到垃圾收集器甚至不需要做任何事情的地步:
$ ghc -rtsopts -O2 testInt && ./testInt +RTS -s
[1 of 1] Compiling Main ( testInt.hs, testInt.o )
Linking testInt ...
5000000050000000
51,752 bytes allocated in the heap
3,480 bytes copied during GC
44,384 bytes maximum residency (1 sample(s))
17,056 bytes maximum slop
1 MB total memory in use (0 MB lost due to fragmentation)

Tot time (elapsed) Avg pause Max pause
Gen 0 0 colls, 0 par 0.000s 0.000s 0.0000s 0.0000s
Gen 1 1 colls, 0 par 0.000s 0.000s 0.0001s 0.0001s

INIT time 0.000s ( 0.000s elapsed)
MUT time 0.101s ( 0.101s elapsed)
GC time 0.000s ( 0.000s elapsed)
EXIT time 0.000s ( 0.000s elapsed)
Total time 0.103s ( 0.102s elapsed)

%GC time 0.1% (0.1% elapsed)

Alloc rate 511,162 bytes per MUT second

Productivity 99.8% of total user, 100.9% of total elapsed

但是,如果我更改 test 的类型至 test :: Word -> Word ,然后产生大量垃圾并且代码运行速度慢 40 倍。
ghc -rtsopts -O2 testWord && ./testWord +RTS -s
[1 of 1] Compiling Main ( testWord.hs, testWord.o )
Linking testWord ...
5000000050000000
11,200,051,784 bytes allocated in the heap
1,055,520 bytes copied during GC
44,384 bytes maximum residency (2 sample(s))
21,152 bytes maximum slop
1 MB total memory in use (0 MB lost due to fragmentation)

Tot time (elapsed) Avg pause Max pause
Gen 0 21700 colls, 0 par 0.077s 0.073s 0.0000s 0.0000s
Gen 1 2 colls, 0 par 0.000s 0.000s 0.0001s 0.0001s

INIT time 0.000s ( 0.000s elapsed)
MUT time 4.551s ( 4.556s elapsed)
GC time 0.077s ( 0.073s elapsed)
EXIT time 0.000s ( 0.000s elapsed)
Total time 4.630s ( 4.630s elapsed)

%GC time 1.7% (1.6% elapsed)

Alloc rate 2,460,957,186 bytes per MUT second

Productivity 98.3% of total user, 98.3% of total elapsed

为什么会这样?我预计性能几乎相同?
(我在 x86_64 GNU/Linux 上使用 GHC 版本 8.0.1)

编辑:我提交了一个错误: https://ghc.haskell.org/trac/ghc/ticket/12354#ticket

最佳答案

这可能主要是因为重写规则存在于 Int 而不是 Word。我这么说是因为如果我们使用 -fno-enable-rewrite-rulesInt如果我们得到一个更接近但没有那么糟糕的时间 Word案子。

% ghc -O2 so.hs -fforce-recomp -fno-enable-rewrite-rules && time ./so
[1 of 1] Compiling Main ( so.hs, so.o )
Linking so ...
5000000050000000
./so 1.45s user 0.03s system 99% cpu 1.489 total

如果我们用 -ddump-rule-rewrites 转储重写规则并比较这些规则,然后我们会看到在 Int 中触发的规则案例而不是 Word案子:
 Rule: fold/build
Before: GHC.Base.foldr
...

该特定规则在 Base 4.9 GHC.Base line 823 中(注意,我自己实际上正在使用 GHC 7.10)并且没有提到 Int明确地。我很好奇为什么它没有为 Word 开火,但现在没有时间进一步调查。

关于haskell - Word foldl' 没有像 Int foldl' 那样优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38113153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com