You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GHC函数局部定义计算缓存规则与性能差异技术问询

Haskell代码实现

内部计算求和(无lambda)

in_no_lambda :: [Int] -> [Int] -> [Int]
in_no_lambda xs = fmap (aux_in_no_lambda xs)

aux_in_no_lambda :: [Int] -> Int -> Int
aux_in_no_lambda xs i = let sum_xs = {-# SCC "sum_in_no_lambda" #-} sum xs
                        in sum_xs + i

内部计算求和(使用lambda)

in_lambda :: [Int] -> [Int] -> [Int]
in_lambda xs = fmap (aux_in_lambda xs)

aux_in_lambda :: [Int] -> Int -> Int
aux_in_lambda xs = let sum_xs = {-# SCC "sum_in_lambda" #-} sum xs
                   in \i -> sum_xs + i

外部计算求和

out :: [Int] -> [Int] -> [Int]
out xs = fmap (aux_out sum_xs)
  where sum_xs = {-# SCC "sum_out" #-} sum xs

aux_out :: Int -> Int -> Int
aux_out sum_xs i = sum_xs + i
性能分析数据
成本中心(COST CENTRE)  模块(MODULE)  源码位置(SRC)                编号(no.)  调用次数(entries)  耗时占比(%time)  内存占比(%alloc)  累计耗时占比(%time)  累计内存占比(%alloc)

MAIN                 MAIN          <built-in>                122           0   14.1    0.0   100.0  100.0
 CAF                 Main          <entire-module>           243           0    0.0    0.0    85.9  100.0
  main               Main          app/Main.hs:(6,1)-(12,22) 244           1   11.8   18.7    85.9  100.0
   in_lambda         Lib           src/Lib.hs:26:1-38        248           1   20.6   27.1    26.3   27.1
    sum_in_lambda    Lib           src/Lib.hs:29:61-66       249           1    5.7    0.0     5.7    0.0
   in_no_lambda      Lib           src/Lib.hs:16:1-44        246           1   22.2   27.1    22.9   27.1
    sum_in_no_lambda Lib           src/Lib.hs:19:69-74       247    10000001    0.8    0.0     0.8    0.0
   out               Lib           src/Lib.hs:(36,1)-(37,45) 250           1   19.2   27.1    24.9   27.1
    sum_out          Lib           src/Lib.hs:37:40-45       251           1    5.7    0.0     5.7    0.0
技术问询
  1. GHC编译器对in_no_lambda与in_lambda是否采用不同优化规则,导致后者的sum_xs仅被计算一次?若存在该差异,具体规则是什么?如何进行实证验证?
  2. 成本中心sum_in_no_lambda的调用次数达千万级,但耗时占比却低于仅调用一次的sum_in_lambda和sum_out,该现象该如何解释?

内容的提问来源于stack exchange,提问作者Damian Nadales

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:37:46