使用低位整数类型,如`Int8`及其用途

时间:2012-01-22 19:26:15

标签: haskell integer word integer-promotion

最近我了解到,每个计算周期都对机器字执行,而大多数现代处理器和OS都是32位或64位。那么使用像Int16Int8Word8这样较小的位值有什么好处?他们到底是为了什么?它只是减少存储吗?

我编写了一个复杂的计算程序,它由几个模块组成,但只有一个返回Word64值的函数接口,因此整个程序的结果为Word64。我对这个问题的答案感兴趣,因为在这个程序中我发现自己使用了很多不同的Integral类型,如Word16Word8来表示小实体,并且看到它们相当经常被转换为fromIntegral让我思考:我在那里犯了错误,那些我不知道被盲目吸引的类型的确切好处是什么?是否有意义利用其他整数类型并用fromIntegral直接转换它们,或者我应该在任何地方使用Word64

2 个答案:

答案 0 :(得分:8)

在GHC中,固定大小的整数类型都占用一个完整的机器字,因此不会节省空间。在大多数情况下,使用机器字大小的类型(即IntWord)可能比固定大小类型更快,但使用固定大小的整数类型将比执行显式换行更快-around。

您应该为您正在使用的值范围选择合适的类型。 maxBound :: Word8为255,255 + 1 :: Word8为0 - 如果您正在处理八位字节,那正是您想要的。 (例如,ByteString被定义为存储Word8 s。)

如果您只有一些不需要特定位数的整数,并且您正在进行的计算不会溢出,只需使用IntWord(甚至Integer)。固定大小类型不如常规整数类型常见,因为大多数情况下,您不需要特定的大小。

所以,不要将它们用于表现;如果您正在寻找它们的特定语义,请使用它们:具有已定义溢出行为的固定大小整数类型。

答案 1 :(得分:6)

这些较小的类型只有在将它们存储在未装箱的阵列或类似物中时才能减少内存。在那里,每个将占用类型后缀所指示的位数。

在一般情况下,它们都占用与IntWord完全相同的存储空间,主要区别在于使用固定宽度类型时值会自动缩小到适当的位大小, IntWord比({1}}等更多优化(主要是重写规则),因此使用这些操作会更慢一些操作。

关于是否始终使用Int8或使用较小类型的问题,这取决于。在64位系统上,当使用优化进行编译时,Word64Word的性能应该大致相同,因为两者都应该解压缩并且工作在原始机器上完成{{ 1}}。但是Word64可能还有一些规则还没有Word#对应的规则,所以也许毕竟存在差异。在32位系统上,Word上的大多数操作都是通过C调用实现的,因此Word64上的操作 Word64上的操作慢。< / p>

因此,取决于更重要的是,代码的简单性或不同系统上的性能,

  1. 始终使用Word64:简单代码,64位系统上的良好性能
  2. 使用Word,只要您的值保证适合32位并在最近的安全时刻转换为Word64:代码更复杂,但在32位系统上性能更佳。