作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要改变 Word8
的固定大小数组中的元素很快。为此,我使用了 IOUArray
.我需要通过 websocket 连接发送这个数组。函数sendBinaryData
来自 websockets 包需要一个 ByteString
.我需要从一种表示转换为另一种表示。我目前正在使用此功能:
arrayToBS :: IOUArray Int Word8 -> IO (BS.ByteString)
arrayToBS = (fmap BS.pack) . getElems
[Word8]
在将该列表打包成字节串之前,从分析中我可以看到它很慢。我想知道是否有办法加速这个功能,或者可能直接通过 websocket 连接发送数组?
size = 1000;
numBytes = size * size * 4
newBuffer :: IO (IOUArray Int Word8)
newBuffer = newArray (0, numBytes) 200 :: IO (IOUArray Int Word8)
COST CENTRE MODULE SRC %time %alloc
arrayToBS Lib src/Lib.hs:28:1-37 88.1 99.0
newBuffer Lib src/Lib.hs:(23,1)-(25,12) 9.9 0.8
arrayToBS
会比创建数组快得多。
size
到 100:
COST CENTRE MODULE SRC %time %alloc
arrayToBS Lib src/Lib.hs:21:1-37 100.0 86.1
mkEncodeTable.table Data.ByteString.Base64.Internal Data/ByteString/Base64/Internal.hs:105:5-75 0.0 8.0
mkEncodeTable.ix Data.ByteString.Base64.Internal Data/ByteString/Base64/Internal.hs:104:5-43 0.0 1.1
最佳答案
免责声明 :我对这些低级原语不是很熟悉,所以在某些情况下这可能是不安全的。
您至少需要复制一次数据,因为正如@user2407038 所说,底层数据存储在 IOUArray
中。是一个未固定的阵列,所以我们不能指望 GHC 不移动阵列。然而,反向( ByteString
到 IOArray
)在没有副本的情况下也是可能的。
{-# LANGUAGE UnboxedTuples, MagicHash #-}
import Data.ByteString.Internal (ByteString(..))
import Data.Array.IO.Internals (IOUArray(..))
import Data.Array.Base (STUArray(..))
import Data.Word (Word8)
import Foreign.ForeignPtr (mallocForeignPtrBytes, withForeignPtr)
import GHC.IO (IO(..))
import GHC.Exts (copyMutableByteArrayToAddr#, Ptr(..), Int(..))
arrayToBS :: IOUArray Int Word8 -> IO ByteString
arrayToBS (IOUArray (STUArray _ _ n@(I# n') mutByteArr)) = do
bytes <- mallocForeignPtrBytes n
withForeignPtr bytes $ \(Ptr addr) -> IO $ \state ->
(# copyMutableByteArrayToAddr# mutByteArr 0# addr n' state, () #)
pure (PS bytes 0 n)
'A'
的 ascii 代码是
65
):
ghci> iou <- newListArray (-2,9) [65,67..] :: IO (IOUArray Int Word8)
ghci> arrayToBS iou
"ACEGIKMOQSUW"
关于arrays - IOUArray 到 ByteSring,尽快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45784663/
在Powershell中,如何读取并尽快获取包含巨大文本文件中的特定字符串的最后一行(或所有行)(约200000行/ 30 MB)? 我正在使用 : get-content myfile.txt |
我正在使用 AngularJS 1.4,这是我页面的代码 // this is ng-include - first.html
我需要改变 Word8 的固定大小数组中的元素很快。为此,我使用了 IOUArray .我需要通过 websocket 连接发送这个数组。函数sendBinaryData来自 websockets 包
我是一名优秀的程序员,十分优秀!