9

最近我了解到,每个计算周期都在机器字上执行,在大多数当代处理器和操作系统上都是 32 位或 64 位。那么使用较小的位大小值(如Int16, Int8, )有什么好处Word8?它们究竟是为了什么?只是减少存储吗?

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

4

2 回答 2

8

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

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

如果您只有一些不需要特定位数的整数,并且您正在执行的计算不会溢出,请使用Intor Word(或什至Integer)。固定大小的类型不如常规整数类型常见,因为大多数时候,您不需要特定的大小。

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

于 2012-01-22T19:40:40.087 回答
6

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

Int在一般使用中,它们都占用与or一样多的存储空间Word,主要区别在于,当使用固定宽度类型时,值会自动缩小到适当的位大小,并且(仍然)有更多优化(以主要重写规则) forIntWord比 forInt8等,所以使用这些操作会更慢。

关于是使用Word64整个类型还是使用较小类型的问题,这取决于。在 64 位系统上,使用优化进行编译时,Word和的性能Word64应该基本相同,因为重要的地方都应该解包并且工作是在原始机器上完成的Word#。但是可能仍然有一些规则Word还没有Word64对应的规则,所以也许毕竟存在差异。在 32 位系统上,大多数操作Word64都是通过 C 调用实现的,因此操作Word64比操作慢得多Word

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

  1. 贯穿始终:简单的Word64代码,在 64 位系统上的良好性能
  2. Word只要保证您的值适合 32 位并在最近的安全时刻转换为:Word64更复杂的代码,但在 32 位系统上性能更好。
于 2012-01-22T19:45:57.097 回答