簡體   English   中英

創建Swift數組的最快方法 <Float> 固定數量

[英]Fastest possible way to create a Swift Array<Float> with a fixed count

我注意到了這個:

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>方便嗎? 在我的項目的上下文中,我可能在內部處理不安全的指針,並僅在模塊外部需要時使用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萬個花車上)

array.create:9.256 ms

array.create更快:0.004毫秒

Array.reserveCapacity?:0.264 ms

ContiguousArray?:10.154 ms

ContiguousArray.reserveCapacity:3.251 ms

UnsafeMutableBufferPointer BaseMath:0.049 ms

我在發布模式下正在iphone模擬器上運行應用程序。 我知道我應該在命令行/獨立版中執行此操作,但由於我打算將其作為應用程序的一部分來編寫,這可能沒問題。

對於我試圖做的事情,UnsafeMutableBufferPointer似乎很棒,但你必須使用BaseMath及其所有符合性。 如果您追求更一般或其他背景。 一定要閱讀所有內容並確定哪一個適合您。

如果您需要性能並且知道所需的大小,可以使用reserveCapacity(_ :) ,這將預先分配數組內容所需的內存。 根據Apple文檔:

如果要向數組添加已知數量的元素,請使用此方法以避免多次重新分配。 此方法可確保陣列具有唯一的,可變的,連續的存儲,並為至少所請求的元素數分配空間。

即使現有存儲具有存儲minimumCapacity元素的空間,在具有橋接存儲的陣列上調用reserveCapacity(_ :)方法也會將副本觸發到連續存儲。

出於性能原因,新分配的存儲的大小可能大於請求的容量。 使用array的capacity屬性確定新存儲的大小。

這是我想要的最接近的東西。 有一個名為BaseMath的庫(由Jeremy Howard創建),並且有一個新的類調用AlignedStorage和UnsafeMutableBufferPointer。 它具有很多數學性能,而且速度非常快,因此在處理數學算法時減少了很多指針的管理。

但這還有待測試,這個項目很新。 我將保持這個Q開放,看看是否有人可以提出更好的建議。

注意:這是我正在做的事情中最快的。 如果你真的需要一個好的struct值類型Array(和變體),請參閱其他ans。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM