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
技术问询
- GHC编译器对
in_no_lambda与in_lambda是否采用不同优化规则,导致后者的sum_xs仅被计算一次?若存在该差异,具体规则是什么?如何进行实证验证? - 成本中心
sum_in_no_lambda的调用次数达千万级,但耗时占比却低于仅调用一次的sum_in_lambda和sum_out,该现象该如何解释?
内容的提问来源于stack exchange,提问作者Damian Nadales
相关产品推荐
相关产品推荐

