1

NSMutableArrayまたはを使用する場合NSMutableDictionary、入れたい要素の数または最大要素数がわかっている場合、通常はarrayWithCapacityまたはdictionaryWithCapacityで作成しますが、配列/辞書の(初期)容量を指定することは本当に役立つのでしょうか?

内部でどのように実装されているかはわかりませんが、コレクション内の要素数が容量に達したり、容量に近づいたりすると、コレクションが容量を拡張する可能性があると思うので、可変配列を作成した場合容量32、32番目のオブジェクトを入れる限り、別の容量に拡張されますか? それとも、30個目のオブジェクトを入れても、オブジェクトが増えると思って容量が拡張されますか?

したがって、これらの方法が本当に役立つ場合は、次のようなものを使用する必要があります。

 *withCapacity:maxNumberOfElements * 1.5

それ以外の

*withCapacity:maxNumberOfElements

私のオブジェクトには十分な容量があり、すべてのオブジェクトを入れても拡張されませんか?

4

3 に答える 3

0

現実的に言えば、多くの配列/辞書を作成しない限り (たとえば、UI ページを表示する頻度と比較して)、 を使用してもパフォーマンスが大幅に向上することはありません...WithCapacity。それでも、少なくとも数百のエントリを持つ配列/辞書がない限り、それについて心配する意味はありません。

推測するサイズに関しては、最終的なサイズよりも少し (5 ~ 10%) 大きいのが理想的ですが、ストレージの制約を受けやすいかどうかにもよります。

ただし、エントリ数が正確にわかっている場合は、その正確な量を指定します (何かを指定する場合)。

于 2012-08-20T01:09:49.820 に答える
0

これは、コレクションに多数の要素を追加する予定がある場合、またはロードする要素の正確な数がわかっている場合に役立ちます。コレクションのサイズ変更には CPU サイクルがかかるため、不必要にサイズを変更すると、最終的にはデバイスがバッテリーで動作する時間を短縮することになります。

次の例を考えてみましょう: 3000 個の要素を配列にロードしようとしているとします。たとえば、16 項目のスペースを含む既定の配列を割り当てる場合、3000 要素を保持するのに必要なサイズに到達する前に、配列のサイズを 8 回変更する必要があります。初期位置にコピーされた要素は、配列のサイズが変更されるたびにコピーする必要があるため、3000 以上の追加のコピー操作が必要になります。要素の正確な数がわかっている場合は、コピーが発生するのを防ぐことができます。

さらに、追加しない要素のために配列がメモリを浪費することはありません。3000 個の要素を 1 つずつ追加すると、さらに多くの要素を見越して、配列が内部的に 4000 まで大きくなる可能性があります。最後の 1000 個の要素が無駄になります。

要約すると、正確なターゲット サイズが確実にわかっている場合は、コレクションを容量で初期化する必要があります。この状況は、ファイルまたはネットワーク接続からデータを逆シリアル化するときによく発生します。サイズがわからない場合は、推測せずにデフォルトの初期化を実行することをお勧めします。

于 2012-08-20T01:21:54.220 に答える
0

パフォーマンスの観点から有用です。容量が頻繁に拡張されると、新しい配列がメモリに割り当てられ (通常は現在の容量の 2 倍)、古い配列が新しい配列にコピーされます。これは、要素数が増えるにつれてコストが高くなり始める可能性があるため、事前に容量が (大まかに) わかっている大きな配列がある場合は、initWithCapacity を使用することをお勧めします。一方、必要以上に大きなものを割り当てると、スペースが無駄になるため、標準の「注意して使用する」警告が適用されます。

于 2012-08-20T00:59:33.833 に答える