繁体   English   中英

字节串的有效转换为[Word16]

[英]Efficient Conversion of Bytestring to [Word16]

我试图从字节字符串到Word16s列表进行简单转换。 下面使用Data.Binary.Get的实现可行,但它是代码中的性能瓶颈。 这是可以理解的,因为IO总是很慢,但我想知道是否有更有效的方法来做到这一点。

getImageData' = do
    e <- isEmpty
    if e then return []
      else do
      w <- getWord16be
      ws <- getImageData'
      return $ w : ws

我怀疑你遇到的与Data.Binary.Get有关的一个大问题是,解码器本质上对你的目的太严格了。 这似乎也适用于serialise ,也可能是其他序列化库。 我认为根本的问题在于,只要ByteString具有偶数个字节, 您就知道操作会成功,但是库不知道。 所以它必须在整个ByteString读取它才能得出结论“啊是的,一切都很好”并构建你所请求的列表。 实际上,在构建结果的过程中,它会在实际执行任何有用的操作之前构建一系列闭包(数量与长度成比例)。

你怎么解决这个问题? 只需直接使用bytestring库。 最简单的方法是使用unpack ,但我认为你可能会获得稍微好一点的性能:

{-# language BangPatterns #-}
module Wordy where
import qualified Data.ByteString as BS
import Data.ByteString (ByteString)
import Data.Word (Word16)
import Data.Maybe (fromMaybe)
import Data.Bits (unsafeShiftL)

toDBs :: ByteString -> Maybe [Word16]
toDBs bs0
  | odd (BS.length bs0) = Nothing
  | otherwise = Just (go bs0)
  where
    go bs = fromMaybe [] $ do
      (b1, bs') <- BS.uncons bs
      (b2, bs'') <- BS.uncons bs'
      let !res = (fromIntegral b1 `unsafeShiftL` 8) + fromIntegral b2
      Just (res : go bs'')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM