Arrays 索引/数据掩蔽时的最佳数据获取/设置uint8

Arrays 索引/数据掩蔽时的最佳数据获取/设置uint8,arrays,swift,optimization,nsdata,mask,Arrays,Swift,Optimization,Nsdata,Mask,我正在尝试创建数据掩码函数 我找到了两种方法: 使用数据下标 很慢 从数据创建数组,更改它,然后将其转换回 大约快70倍 使用的内存是原来的2倍 为什么数据订阅这么慢? 有没有更好的方法在不复制内存的情况下获取/设置索引处的uint8 这是我的测试: var data = Data(bytes: [UInt8](repeating: 123, count: 100_000_000)) let a = CFAbsoluteTimeGetCurrent() // data masking

我正在尝试创建数据掩码函数

我找到了两种方法:

  • 使用数据下标

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

    • 大约快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
    
    var data=data(字节:[UInt8](重复:123,计数:100)
    设a=CFAbsoluteTimeGetCurrent()
    //数据屏蔽
    
    对于0..中的i,我无法确切地告诉您为什么第一种方法(通过订阅
    数据
    值)如此缓慢。根据仪器,很多时间 在调用 底层
    NSMutableData
    对象

    但是您可以在不复制 将数据传输到阵列:

    data.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer<UInt8>) -> Void in
        for i in 0..<data.count {
            bytes[i] = bytes[i] &+ 1
        }
    }
    
    data.withUnsafeMutableBytes{(字节:UnsafeMutablePointer)->Void in
    因为我在0。。