繁体   English   中英

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

[英]How fast is 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 :与数据查找相比,模式匹配的速度有多快?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM