[英]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.