26

容量を決定する際に NSMutableArray を最適に初期化する方法について誰かアドバイスがありますか? ドキュメントには、「...配列を作成するときにサイズを指定しても、指定したサイズは「ヒント」と見なされます。配列の実際のサイズは 0 のままです。」そう...

1) 通常使用している容量よりも大きな容量で初期化した場合、メモリの浪費を心配する必要はありませんか?

2) 通常使用する容量よりも低い容量で初期化する場合、余分な要素を保持するためにより多くのメモリを割り当てる処理時間が長くなることを心配する必要がありますか?

この初期化された容量は、このデータ型のパフォーマンス/メモリ使用量にどの程度影響しますか?

4

2 に答える 2

41

Matt Gallagherは、Cocoa のコレクション クラスに関する非常に有益な記事を、いくつかのベンチマーク ( with と without initWithCapacity:、クラス間の比較)とともに書いています。

http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html

長さ 1,000,000の NSMutableArray に対する彼のテスト (入手可能なソース) は、 capacityなしで 0.582256 秒、 capacityでわずか0.572139 秒かかりました。

テスト | テスト 時間
[NSMutableArray 配列] | 0.582256 秒
[NSMutableArray arrayWithCapacity:1000000] | 0.572139 秒
コンテンツの反復 | 0.004713 秒

ユースケースの 99% で問題ないと思います[NSMutableArray array]。ただし、結果の配列の実際のサイズがわかっている場合は、[NSMutableArray arrayWithCapacity:]どちらを使用しても害はありません。


そして、Peter Ammon ( Apple の AppKit/Foundation チームの開発者) によるこの記事では、いくつかの洞察に満ちたベンチマークが紹介されています。

http://ridiculousfish.com/blog/archives/2005/12/23/array/


編集 (2012 年 3 月 12 日):

http://darkdust.net/writings/objective-c/nsarray-enumeration-performanceからのアレイの初期化パフォーマンスに関する詳細な洞察

[…]私[=>DarkDust]も、アレイの作成方法によってパフォーマンスが異なるかどうかを知りたいと思っていました。2 つの異なる方法をテストしました。

  • オブジェクト インスタンスを参照する C 配列を作成し、 を使用して配列を作成しますinitWithObjects:count:
  • を作成しNSMutableArray、続いて を使用してオブジェクトを追加しますaddObject:

[…] 割り当て時に違いがあります:initWithObjects:count: メソッドの方が高速です。オブジェクトの数が非常に多い場合、この差が大きくなる可能性があります。


編集 (2014 年 3 月 6 日):

http://ciechanowski.me/blog/2014/03/05/exposing-nsmutablearray/からのアレイの初期化パフォーマンスに関する詳細な洞察:

初期容量を連続する 2 の累乗に設定して、新しい配列を割り当てましょう。

for (int i = 0; i < 16; i++) {
    NSLog(@"%@", [[[NSMutableArray alloc] initWithCapacity:1 << i] explored_description]);
}

サプライズサプライズ:

size: 2 // 要求された容量: 1
size: 2 // 要求された容量: 2
size: 4 // 要求された容量: 4
size: 8 // 要求された容量: 8
size: 16 // 要求された容量: 16
サイズ: 16 // 要求された容量: 32
サイズ: 16 // 要求された容量: 64
サイズ: 16 // 要求された容量: 128
...
// 'size: 16' ずっと下

于 2010-10-16T12:05:22.633 に答える
15

大きすぎる容量を与えることによってスペースが無駄になるかどうかは、実際には Apple が意図的に公開していない実装の詳細であると思います。NSMutableArray はクラス クラスタです。これは、実際には NSMutableArray のインスタンスを取得するのではなく、同じインターフェイスに従う別の特殊なクラスを取得することを意味します。また、Apple は、どのクラスがどのような場合に返され、どのように動作するかを教えてくれません。ですから、ここで本当のアドバイスをするのは難しいです。

平均してXの容量が必要になることが本当にわかっている場合は、それを使用してください。そうでなければ、パフォーマンスの問題がない限り、私は容量をまったく気にせず、ただ使用し[NSMutableArray array]ます...

于 2010-10-16T07:56:25.950 に答える