任何Word32
数目可如下表达为Word8
号的线性组合:性能改进作用
x = a + b * 2^8 + c * 2^16 + d * 2^24
换句话说,这是在碱的2^8
的x
表示。为了获得这些因素,我实现了以下功能:
word32to8 :: Word32 -> (Word8,Word8,Word8,Word8)
word32to8 n = (fromIntegral a,fromIntegral b,fromIntegral c,fromIntegral d)
where
(d,r1) = divMod n (2^24)
(c,r2) = divMod r1 (2^16)
(b,a) = divMod r2 (2^8)
它工作正常,但由于我的程序正在使用此功能一堆的时候,我还以为你们可以给我如何改善的想法(如果可能)执行此操作。任何小小的改进对我来说都是好的,无论是在时间还是空间上。对我来说,它看起来非常简单,以至于无法实现性能提升,但我仍然想问这个问题,以防万一我缺少某些东西。
顺便说一下,我对fromIntegral
的所有重复感到恼火,但转换是必要的,因此类型可以匹配。
在此先感谢。
我认为一个更快但可能不太便携的pproach将使用'Word32'的'Storable'实例来访问底层的字节级表示,然后直接从中读取所有四个字节。 –
@GabrielGonzalez:这可能比4'divMod's更快,但它绝对不是最佳选择。使用'可存储'意味着分配一个新的内存块,复制到它并回读。 @ ertes的解决方案将避免额外的分配和复制。 –