最近我的特定代码段在性能方面遇到问题。
首先从某些上下文开始:
我正在尝试重新组织Data
对象中的元素。 Data
代表3D体素体积(每个UInt8
,Int16
或Int32
,只有在运行时才知道,在编译时不知道)
当前,我的Data
对象中的元素是按照x
轴,然后依次是y
和z
的顺序排列的。
我不希望他们这么做。我希望对它们进行排序: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(...)
慢