Performance 将函数提升到顶层会导致编译时间增加三倍
我在Windows上使用GHC 8.4.2。我的程序取决于库,版本: (库本身并不重要,但作为大量使用类型族的代码示例除外。) 在我的机器上编译此代码需要9秒。但是,当我试图将Performance 将函数提升到顶层会导致编译时间增加三倍,performance,haskell,ghc,type-families,Performance,Haskell,Ghc,Type Families,我在Windows上使用GHC 8.4.2。我的程序取决于库,版本: (库本身并不重要,但作为大量使用类型族的代码示例除外。) 在我的机器上编译此代码需要9秒。但是,当我试图将从phase1移动到phase2函数,使其脱离where子句并成为顶级函数时,编译时间会激增到~29秒 将函数提升到顶层会导致编译速度变慢,这有什么原因吗 编辑:作为另一个数据点,将函数移动到顶层,但使用-XPartialTypeSignatures如下: {-# LANGUAGE PartialTypeSignature
从phase1移动到phase2
函数,使其脱离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秒原始编译时间已经很糟糕了。我建议在GHC trac上打开票据,特别是因为这是一个非常小的独立示例。当您将
从Phase1移动到Phase2
到顶层时,您是否也将其签名放在顶层?对于像Phase01
这样的大型类型级列表,类型推断(没有签名)比类型检查(有签名,甚至是部分签名)要困难得多。@AntC是的,大约29秒是顶级签名。打开GHC票据,似乎减速与示例模块的导出列表有关。如果我将模块Main(Main)写入其中
而不是导出所有内容,则即使函数从Phase1到Phase2
处于顶层,减速也会消失。
{-# 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