Haskell模式匹配的速度有多快?

时间:2015-10-07 16:11:43

标签: performance function haskell pattern-matching

我们主要使用数据来存储值,如下所示:

data Sex = Male | Female
data Person = Person {name :: String, age :: Int, sex :: Sex}

charlie :: Person
charlie = Person "Charlie" 32 Male

现在我们有了很好的函数name agesex来获取数据值。

但是,通过GADT和Rank2,我们可以做一些更酷的事情:

{-# LANGUAGE GADTs      #-}
{-# LANGUAGE Rank2Types #-}

data Sex = Male | Female

data Data a where
    Name :: Data String
    Age  :: Data Int
    Sex  :: Data Sex

type Person = forall a. Data a -> a

charlie :: Person
charlie Name = "Charlie"
charlie Age  = 32
charlie Sex  = Male

所以,这真是太棒了。它为我们提供了一个美妙的语法来定义人,并且使用GADT。

但这真的更好吗?这在运行时如何表示?模式匹配在表示中实际上比数据更慢和/或更大吗?

lt; dr :与数据查找相比,模式匹配的速度有多快?

1 个答案:

答案 0 :(得分:3)

如果使用-ddump-asm编译代码,您可以看到模式匹配是一系列比较并跳转到指令中嵌入的数据(加载字符串的地址,加载数字32的常量,等)。

由于间接性,容器(如Map或HashMap)会变慢,但希望很明显,静态命名的变量比遍历(可能是动态的)树结构更快。