簡體   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