gpt4 book ai didi

arrays - IOUArray 到 ByteSring,尽快

转载 作者:行者123 更新时间:2023-12-04 20:31:17 25 4
gpt4 key购买 nike

我需要改变 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)

以及绩效报告中的一个异常(exception):
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 不移动阵列。然而,反向( ByteStringIOArray )在没有副本的情况下也是可能的。

{-# 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com