[英]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
age
和sex
来获取数据值。
但是,使用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.