3

我注意到这一点:

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 及其所有一致性。如果您追求更一般或其他背景。请务必阅读所有内容并确定哪一个适合您。

4

2 回答 2

1

如果您需要性能,并且知道您需要的大小,您可以使用reserveCapacity(_:),这将预先分配数组内容所需的内存。根据 Apple 文档:

如果要将已知数量的元素添加到数组中,请使用此方法来避免多次重新分配。此方法确保数组具有唯一的、可变的、连续的存储空间,并为至少请求数量的元素分配空间。

即使现有存储有空间存储 minimumCapacity 元素,在具有桥接存储的阵列上调用 reserveCapacity(_:) 方法也会触发复制到连续存储。

出于性能原因,新分配的存储大小可能大于请求的容量。使用数组的容量属性来确定新存储的大小。

于 2019-01-23T06:19:20.877 回答
0

这是最接近我想要的东西。有一个名为 BaseMath 的库(由 Jeremy Howard 创立),还有一个名为 AlignedStorage 和 UnsafeMutableBufferPointer 的新类。它具有大量的数学运算能力,而且速度也非常快,因此这减少了在处理数学算法时大量的指针管理。

但这还有待测试,这个项目很新。我会让这个 Q 打开,看看是否有人可以提出更好的建议。

注意:在我正在做的事情中,这是最快的。如果您真的需要一个好的结构值类型数组(和变体),请参阅其他答案。

于 2019-01-22T23:57:51.493 回答