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' ずっと下