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

Nik*_*kov 9 haskell integer cpu-word integer-promotion

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

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

ehi*_*ird 8

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

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

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

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


Dan*_*her 6

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

在一般使用中,它们都采取完全一样多的存储作为IntWord,主要区别在于,使用固定宽度的类型时的值被自动缩小到适当的位尺寸,并有(仍然)更多的优化(在形式重写规则主要是for for IntWordfor for Int8等,所以使用那些操作会慢一些.

关于是否全部使用Word64或使用较小类型的问题,这取决于.在64位系统上,当使用优化进行编译时,性能WordWord64应该大致相同,因为两者都应该解压缩并且工作在原始机器上完成Word#.但是,可能仍然有一些规则Word有没有Word64对应的是,这样也许是有区别的毕竟.在32位系统中,大多数操作Word64都是通过C调用来实现,所以在操作Word64比操作更慢Word.

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

  1. Word64全程使用:简单的代码,64位系统的良好性能
  2. 使用Word只要你的价值观,保证适应32位,转换为Word64在最新的安全时刻:更复杂的代码,但在32位系统更好的性能.