gpt4 book ai didi

模式匹配的性能

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

我正在阅读 Learn you a Haskell ,特别是关于模式匹配的章节。以下是本教程中提供的用于计算列表长度的代码:

length' :: (Num b) => [a] -> b  
length' [] = 0
length' (_:xs) = 1 + length' xs

我的问题是,反转递归顺序(通过将基本情况放在下面)会显示任何显着的性能提升吗?

length' :: (Num b) => [a] -> b
length' (_:xs) = 1 + length' xs
length' [] = 0

最佳答案

不,这不会提供任何性能提升。在这两种情况下,编译器都必须评估它的 WHNF 参数以检查它是否为空列表。

实际上,这个函数很可能会在编译期间被重写,生成的代码与您编写的完全不同(假设您使用优化进行编译)。

查看生成的核心(编译后没有优化):

(letrec {
f1_aLn [Occ=LoopBreaker] :: [Integer] -> Integer
[LclId, Arity=1, Str=DmdType]
f1_aLn =
\ (ds_d1gX :: [Integer]) ->
case ds_d1gX of _ [Occ=Dead] {
[] -> fromInteger @ Integer GHC.Num.$fNumInteger 0;
: ds1_d1h4 xs_at0 ->
+ @ Integer
GHC.Num.$fNumInteger
(fromInteger @ Integer GHC.Num.$fNumInteger 1)
(f1_aLn xs_at0)
}; } in
f1_aLn (enumFromTo @ Integer GHC.Enum.$fEnumInteger 1 100))

(letrec {
f2_aBk [Occ=LoopBreaker] :: [Integer] -> Integer
[LclId, Arity=1, Str=DmdType]
f2_aBk =
\ (ds_d1gP :: [Integer]) ->
case ds_d1gP of _ [Occ=Dead] {
[] -> fromInteger @ Integer GHC.Num.$fNumInteger 0;
: ds1_d1gW xs_aBh ->
+ @ Integer
GHC.Num.$fNumInteger
(fromInteger @ Integer GHC.Num.$fNumInteger 1)
(f2_aBk xs_aBh)
}; } in
f2_aBk (enumFromTo @ Integer GHC.Enum.$fEnumInteger 1 100))

我们可以看到编译器生成了等价的语句。仅供引用,这是代码:

main = do
print $ f1 [1..100]
print $ f2 [1..100]

f1 [] = 0
f1 (_:xs) = 1 + f1 xs
f2 (_:xs) = 1 + f2 xs
f2 [] = 0

使用 ghc -ddump-simpl file.hs

编译

关于模式匹配的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40306218/

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