我注意到这一点:
let a = [Float](repeating: 0, count: len)
比仅仅花费更多的时间
let p = UnsafeMutablePointer<Float>.allocate(capacity: len)
但是,不安全指针使用起来不太方便,可能需要创建一个Array<Float>
以传递给其他代码。
let a = Array(UnsafeBufferPointer(start: p, count: len))
但是这样做绝对会杀死它,并且只创建Array
填充零的值会更快。
任何想法如何创建一个Array
更快,同时,有一个实际的Array<Float>
方便?在我的项目的上下文中,我可能可以在内部处理 unsafe 指针,并Array
仅在模块外部需要时将其包装起来。
快速测试这篇文章中的所有答案:
let len = 10_000_000
benchmark(title: "array.create", num_trials: 10) {
let a = [Float](repeating: 0, count: len)
}
benchmark(title: "array.create faster", num_trials: 10) {
let p = UnsafeMutableBufferPointer<Float>.allocate(capacity: len)
}
benchmark(title: "Array.reserveCapacity ?", num_trials: 10) {
var a = [Float]()
a.reserveCapacity(len)
}
benchmark(title: "ContiguousArray ?", num_trials: 10) {
let a = ContiguousArray<Float>(repeating: 0, count: len)
}
benchmark(title: "ContiguousArray.reserveCapacity", num_trials: 10) {
var a = ContiguousArray<Float>()
a.reserveCapacity(len)
}
benchmark(title: "UnsafeMutableBufferPointer BaseMath", num_trials: 10) {
let p = UnsafeMutableBufferPointer<Float>(len) // Jeremy's BaseMath
print(p.count)
}
结果:(在 1000 万次浮点数上)
数组创建:9.256 毫秒
array.create 更快:0.004 毫秒
Array.reserveCapacity ?: 0.264 毫秒
连续阵列?:10.154 毫秒
ContiguousArray.reserveCapacity:3.251 毫秒
UnsafeMutableBufferPointer BaseMath:0.049 毫秒
我正在以发布模式在 iphone 模拟器上临时运行应用程序。我知道我可能应该在命令行/独立中执行此操作,但是由于我打算将其编写为应用程序的一部分,所以这可能没问题。
对于我尝试做的事情,UnsafeMutableBufferPointer 看起来很棒,但是您必须使用 BaseMath 及其所有一致性。如果您追求更一般或其他背景。请务必阅读所有内容并确定哪一个适合您。