gpt4 book ai didi

arrays - 最佳数据在索引/数据屏蔽处获取/设置 uint8

转载 作者:行者123 更新时间:2023-11-28 06:24:45 25 4
gpt4 key购买 nike

我正在尝试创建数据掩码功能。

我找到了两种方法:

  1. 使用数据下标

    • 很慢
  2. 从数据创建数组,更改它然后将其转换回

    • ~快 70 倍
    • 使用 2 倍多的内存

为什么数据订阅这么慢?有没有更好的方法在索引处获取/设置 uint8 而无需复制内存?

这是我的测试:

var data = Data(bytes: [UInt8](repeating: 123, count: 100_000_000))

let a = CFAbsoluteTimeGetCurrent()

// data masking
for i in 0..<data.count {
data[i] = data[i] &+ 1
}

let b = CFAbsoluteTimeGetCurrent()

// creating array
var bytes = data.withUnsafeBytes {
[UInt8](UnsafeBufferPointer(start: $0, count: data.count))
}
for i in 0..<bytes.count {
bytes[i] = bytes[i] &+ 1
}
data = Data(bytes: bytes)

let c = CFAbsoluteTimeGetCurrent()
print(b-a) // 8.8887130022049
print(c-b) // 0.12415999174118

最佳答案

我无法确切地告诉您为什么第一种方法(通过下标 Data 值)如此缓慢。根据仪器,很多时间花费在objc_msgSend,调用方法时底层 NSMutableData 对象。

但是你可以在不复制的情况下改变字节数据到数组:

data.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer<UInt8>) -> Void in
for i in 0..<data.count {
bytes[i] = bytes[i] &+ 1
}
}

这比您的“复制到数组”方法还要快。

在 MacBook 上我得到了以下结果:

  • 数据订阅:7.15 秒
  • 复制到数组并返回:0.238 秒
  • withUnsafeMutableBytes:0.0659 秒

关于arrays - 最佳数据在索引/数据屏蔽处获取/设置 uint8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42321001/

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