索引处的最佳数据 get/set uint8 / 数据屏蔽
Best Data get/set uint8 at index / Data masking
我正在尝试创建数据屏蔽功能。
我找到了两种方法:
使用数据下标
- 很慢
从数据创建数组,更改它然后将其转换回
- ~快 70 倍
- 使用 2 倍多的内存
为什么数据下标这么慢?
有没有更好的方法 get/set uint8 at index 而无需复制内存?
这是我的测试:
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: [=11=], 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
}
}
这比您的 "copy to array" 方法还要快。
在 MacBook 上我得到了以下结果:
- 数据订阅:7.15 秒
- 复制到数组并返回:0.238 秒
- withUnsafeMutableBytes: 0.0659 秒
我正在尝试创建数据屏蔽功能。
我找到了两种方法:
使用数据下标
- 很慢
从数据创建数组,更改它然后将其转换回
- ~快 70 倍
- 使用 2 倍多的内存
为什么数据下标这么慢? 有没有更好的方法 get/set uint8 at index 而无需复制内存?
这是我的测试:
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: [=11=], 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
}
}
这比您的 "copy to array" 方法还要快。
在 MacBook 上我得到了以下结果:
- 数据订阅:7.15 秒
- 复制到数组并返回:0.238 秒
- withUnsafeMutableBytes: 0.0659 秒