逐字节读取和读取Data()对象时的性能问题

时间:2018-07-18 08:37:07

标签: ios swift nsdata

最近我的特定代码段在性能方面遇到问题。

首先从某些上下文开始: 我正在尝试重新组织Data对象中的元素。 Data代表3D体素体积(每个UInt8Int16Int32,只有在运行时才知道,在编译时不知道)

当前,我的Data对象中的元素是按照x轴,然后依次是yz的顺序排列的。

我不希望他们这么做。我希望对它们进行排序:z,然后x,最后是y

我想出了这段代码:

let columns = 512   // x
let rows = 512      // y
let slices = 32     // z

// for the sake of example, elements in my Data() object are Int16, but could be UInt8 or Int32 too
// changes with each execution, not known at compilation, only at runtime
let elementSize = 2    

// Dummy initial data
let initialData = Data.init(bytes: Array<UInt8>((0..<columns*rows*slices*elementSize).lazy.map{ UInt8($0%256) }))

var finalData = Data()
finalData.reserveCapacity(columns*rows*slices*elementSize)

for y in 0..<rows{
    for x in 0..<columns{
        for z in 0..<slices{
            let start = (
                x +
                y*columns +
                z*columns*rows
            ) * elementSize
            // copy two bytes from initial to the end of final
            finalData.append(initialData.subdata(in: start..<start+elementSize))
        }
    }
}

// finalData will then be writen to a file using 'fileHandle.write(finalData)'

我已经发现initialData.subdata(...)initialData[index]快,但仍然太慢。

有什么方法可以加快速度吗?

PS:初始数据来自多个UnsafeRawPointer

//'slice' times
initialData.append(pointer.assumingMemoryBound(to: UInt8.self), count: rows*columns*size))

PS2:我曾尝试使用类似pointer.load(fromByteOffset: start, as: Int16.self)之类的指针来使用指针,但即便如此,它似乎也比subdata(...)

0 个答案:

没有答案