簡體   English   中英

如何有效地將 append 項目轉換為 Swift 中的大型 arrays?

[英]How to efficiently append items to large arrays in Swift?

我正在研究一個 Swift 項目,該項目涉及非常大的動態變化 arrays。 我遇到了一個問題,每次連續操作都比前者花費更長的時間。 我有理由確定這個問題是由附加到 arrays 引起的,因為我在一個簡單的測試中遇到了同樣的問題,它只是附加到一個大數組。

我的測試代碼:

import Foundation

func measureExecution(elements: Int, appendedValue: Int) -> Void {
    var array = Array(0...elements)
    //array.reserveCapacity(elements)
    
    let start = DispatchTime.now()
    array.append(appendedValue)
    let end = DispatchTime.now()
    print(Double(end.uptimeNanoseconds - start.uptimeNanoseconds) / 1_000_000_000)
}

for i in 0...100 {
    measureExecution(elements: i*10000, appendedValue: 1)
}

這將嘗試在 10000 和 1000000 之間的 100 個不同的數組大小,計時從 append 一個項目到數組末尾需要多長時間。 As I understand it, Swift arrays are dynamic arrays that will reallocate memory geometrically (it allocates more and more memory each time it needs to reallocate), which Apple's documentation says should mean appending a single element to an array is an O(1) operation when averaged over many calls to the append(_:) method當對 append(_:) 方法( sourceappending a single element to an array is an O(1) operation when averaged over many calls to the append(_:) method 因此,我認為 memory 分配不會導致問題。

但是,數組的長度與 append 一個元素所需的時間之間存在線性關系。 我繪制了一堆數組長度的時間圖,並且排除了一些異常值,它很明顯是 O(n)。 我還使用保留容量(在代碼塊中注釋掉)運行了相同的測試,以確認 memory 分配不是問題,我得到了幾乎相同的結果: 數組長度和追加時間圖

如何有效地 append 結束大量 arrays (最好不使用reserveCapacity )?

根據我的閱讀,Swift arrays 預分配存儲。 每次填充 Array 的分配存儲空間時,分配的空間都會增加一倍。 這樣你就不會經常進行新的 memory 分配,也不會分配一堆你不需要的空間。

數組 class 確實有一個reserveCapacity(_:) 如果您知道要存儲多少元素,您可能想嘗試一下。

暫無
暫無

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

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