performance - 将函数提升到顶层会导致编译时间增加三倍
问题描述
我在 Windows 上使用 GHC 8.4.2。我有这个程序依赖于库red-black-record,版本2.0.2.2:
{-# LANGUAGE DataKinds, TypeApplications #-}
module Main where
import Data.RBR (FromList,Delete,Variant,I,injectI,winnowI,match)
import GHC.TypeLits
type Phase01 = FromList '[
'("ctor1",Int), '("ctor2",Bool), '("ctor4",Char), '("ctor3",Char),
'("ctor6",Char), '("ctor5",Char), '("ctor10",Char), '("ctor11",Char),
'("ctor13",Char), '("ctor14",Char), '("ctor39",Char), '("ctor46",Char),
'("ctor47",Char), '("ctor44",Char), '("ctor43",Char), '("ctor7",Char),
'("ctor9",Char), '("ctor20",Char), '("ctor45",Char), '("ctor21",Char),
'("ctor48",Char), '("ctor49",Char), '("ctor50",Char), '("ctor41",Char),
'("ctor33",Char), '("ctor32",Char), '("ctor42",Char), '("ctor22",Char),
'("ctor23",Char), '("ctor8",Char), '("ctor40",Char), '("ctor29",Char),
'("ctor24",Char), '("ctor38",Char), '("ctor25",Char), '("ctor26",Char),
'("ctor27",Char), '("ctor28",Char), '("ctor36",Char), '("ctor52",Char),
'("ctor51",Char), '("ctor53",Char), '("ctor12",Char), '("ctor54",Char),
'("ctor15",Char), '("ctor31",Char), '("ctor30",Char), '("ctor34",Char),
'("ctor35",Char), '("ctor17",Char), '("ctor16",Char), '("ctor18",Char),
'("ctor19",Char), '("ctor37",Char)
]
type Phase02 = Delete "ctor1" Int Phase01
main :: IO ()
main = print (match @"ctor17" (fromPhase1ToPhase2 (injectI @"ctor1" 2)))
where
fromPhase1ToPhase2 :: Variant I Phase01 -> Variant I Phase02
fromPhase1ToPhase2 v = case winnowI @"ctor1" @Int v of
Right z -> injectI @"ctor2" False
Left l -> l
(库本身并不重要,除了作为大量使用类型族的代码示例。)
这段代码在我的机器上编译大约需要 9 秒。但是当我尝试将fromPhase1ToPhase2
函数移出where
子句并使其成为顶级函数时,编译时间会飙升至~ 29 秒!
为什么将函数提升到顶层会使其编译速度变慢?
编辑:作为另一个数据点,将函数移动到顶层,但使用-XPartialTypeSignatures
如下:
{-# LANGUAGE PartialTypeSignatures #-}
{-# OPTIONS_GHC -Wno-partial-type-signatures #-}
fromPhase1ToPhase2 :: Variant I _ -> Variant I _
fromPhase1ToPhase2 v = case winnowI @"ctor1" @Int @Phase01 v of
Right z -> injectI @"ctor2" False
Left l -> l
保持原来的编译时间约为 9 秒。
解决方案
推荐阅读
- amazon-ecs - 如何了解 ECS 的默认容量提供程序策略
- wix - 在 MSI 中执行时,VC 可再发行组件安装失败
- php - 可以在整个 symfony 应用程序中使用的变量?- Symfony 4
- java - Spring Boot Security - 允许无需身份验证
- swift - 如何从 [Int] 数组返回组合的 Int?
- python - SQLAlchemy:如何在 Postgres 数据库中执行原始 INSERT sql 查询?
- xml - 元素类型“tag”必须由匹配的结束标签“”终止
- python - Python(Cartopy)在特定国家/地区内绘制阴影图[已解决]
- networking - 使用 ftp 服务器“LIST”实现问题
- python - KNN 模型,accuracy(clf.score) 返回 0