2015-01-07 13 views
5

私はarray.count(配列の要素数)を理解しています。 countは、配列の要素を反復処理するのに便利です。私は、ソートのarray.capacityswift array.capacity vs array.count

capacityの要旨 アレイ(読み取り専用)再配置することなく保存することができるどのように多くの全元素表す整数値を取得します。

私が遊び場で遊んと、アレイの容量は(2ずつ増加)偶数で注目されている実験

var arr = [1, 2, 3 , 4, 5, 6, 7] 
arr.removeLast() // capacity stays the same after a removal 
println(arr.capacity) // 8 
println(arr.count) // 6 

var arr = [1, 2, 3 , 4, 5, 6] 
arr.removeLast() 
println(arr.capacity) // 6 
println(arr.count) // 5 

質問

何アレイ容量の使用ですか?具体的な例を挙げてください。

+0

Afaikはあくまでもメモリスペースを事前割り当てする方法です。あなたはGoogle検索でそれを見つけることができるでしょう。本当にSOの質問ではありません。また、なぜあなたは知る必要がありますか?カウントは十分ではありませんか? – Fogmeister

答えて

14

アレイの容量(特に、reserveCapacityメソッド)を使用すると、アレイにスペースをあらかじめ割り当てることができます。

アレイに要素を追加しており、その容量を超えている場合は、アレイの容量を増やす必要があります。 Swift配列は、その要素をメモリ内に連続して格納するため、内部ストレージを再割り当てし、すべての要素を古いストレージから新しいストレージにコピーする必要があります。 (NSArrayが連続し、その要素を格納するために文書化されていないことに注意してください、私たちは、おそらくwithUnsafeMutableBufferPointer方法の有無に基づいてないことスウィフト配列を推測することができます。)

あなたはするつもりどのように多くの要素事前でを知っていればアレイに追加する場合は、reserveCapacityメソッドを使用して配列の容量をプリセットして、再割り当て(および関連するコピー)を実行する必要がなくなります。

アレイの容量を聞くことができる理由は、システムの仕組みを学び、パフォーマンスの問題をデバッグすることだけです。

通常、容量の予約について心配する必要はありません。再割り当てはほとんどパフォーマンス上の問題ではありません。 Swiftは、効率的な再配置スケジュールを使用して、再配置の数がアレイの最終カウントで対数になるようにします。例えば。一度に1つずつ要素を追加すると、Swiftは20-30回の再割り当てを実行する必要があります。

しかし、配列が非常に大きい(Macではギガバイト、iOSデバイスでは数十メガバイトなど)か、パフォーマンスに影響されやすいコードパスで配列を埋めていることがわかっている場合(オーディオバッファーがマイクロ秒以内に再生を開始する場合)、容量を予約して再割り当てを避けることができます。

再割り当てが問題であることが分かっていない限り、容量の確保について心配する必要はありません。プロファイラーがボトルネックであることや、その他の証拠(オーディオバッファの例でのオーディオグリッチなど)があるためです。

4

は、基本的には、アレイ容量はなし外用持つアレイ容量の使用は何ですか。それはSwiftの内部使用のためにあります。この配列に100個のオブジェクトを割り当てることがわかっている場合、は、配列を作成するときに容量を事前に設定できます。そのようにするには特にが必要です。があります。このようにすると、のゲインはになりません。あなたはボンネットの下を見て、あなたが本当に見る必要のないものを見ました。あなたが見たので、あなたはそれを忘れることができます。

+0

"見たことがあるので、あなたはそれを忘れることができます。" :)それは、それが外部使用のためにどのように役立つことができる例を与えることができますか? –

+0

@raychenonなぜですか? NSArrayを使うと、Appleの開発者は特にarrayWithCapacityを使うのをやめて、それだけですべてを動作させることができます。あなたはおそらく決して使うべきではないものを使う方法の例が必要なのですか? – Fogmeister

+0

@Fogmeister誰かが容量がどのように役立つかをまだ示していないからです。私は寝る前にちょうど質問:) –