【发布时间】:2015-06-08 21:14:11
【问题描述】:
GHC Haskell 公开了prim 包,其中包含未装箱值的定义,例如Int#、Char# 等。
- 它们与常规 Haskell 中默认的
Int、Char等类型有何不同?假设它们更快,但为什么呢? - 什么时候应该使用这些来代替盒装的常规替代品?
- 使用装箱值和未装箱值对程序有何影响?
【问题讨论】:
-
我已经写了an article关于这个,你可能想试一试。
GHC Haskell 公开了prim 包,其中包含未装箱值的定义,例如Int#、Char# 等。
Int、Char 等类型有何不同?假设它们更快,但为什么呢?【问题讨论】:
简单来说,Int 类型的值可能是未计算的表达式。在您“查看”值之前,不会计算实际值。
Int# 类型的值是评估结果。总是。
因此,Int 是一种存在于堆上的数据结构。 Int# 是...只是一个 32 位整数。它可以存在于 CPU 寄存器中。您可以使用单个机器指令对其进行操作。它几乎没有开销。
相比之下,当您编写x + 1 时,您实际上并不是在计算 x + 1,而是在堆上创建一个数据结构,上面写着“当您想要计算这个,做 x + 1"。
简单地说,Int# 更快,因为它不能偷懒。
你应该什么时候使用它?几乎从不。那是编译器的工作。这个想法是您编写了包含Int 的漂亮的高级Haskell 代码,编译器 找出它可以在哪里用Int# 替换Int。 (我们希望!)如果没有,添加一些严格性注释几乎总是比直接使用Int# 更容易。 (它也是不可移植的;只有 GHC 使用 Int# - 尽管目前还没有任何其他广泛使用的 Haskell 编译器。)
【讨论】:
Ints(经过严格评估)和Int#的性能。当使用-O2 编译时,性能实际上没有区别。 GHC 做得很好。