Мэтт Галлахер написал довольно информативную статью о классах коллекций Какао, а также несколько тестов (с initWithCapacity:
и без него, а также сравнения между классами)
http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html
Его тест (источник доступен) для NSMutableArray длина 1,000,000 занял 0,582256сек без емкости и всего 0,572139сек с емкостью .
Test | Time
[NSMutableArray array] | 0.582256 seconds
[NSMutableArray arrayWithCapacity:1000000] | 0.572139 seconds
Iterating contents | 0.004713 seconds
Я бы сказал, что в 99% случаев использования [NSMutableArray array]
просто отлично.Если вы знаете реальный размер результирующего массива, однако, также не помешает использовать [NSMutableArray arrayWithCapacity:]
.
И еще есть статья Питер Аммон (который является разработчиком в команде Apple AppKit / Foundation ) с несколькими проницательными тестами :
http://ridiculousfish.com/blog/archives/2005/12/23/array/
Изменить (12 марта 2012 г.):
Дополнительная информация о производительности инициализации массива из http://darkdust.net/writings/objective-c/nsarray-enumeration-performance
[…] Я [=> DarkDust] также хотел узнать,производительность может отличаться в зависимости от того, как был создан массив.Я протестировал два разных метода:
- Создайте массив C, который ссылается на экземпляры объектов, и создайте массив, используя
initWithObjects:count:
. - Создайте
NSMutableArray
и затем добавляйте объекты, используя addObject:
.
[…] при выделении есть разница: метод initWithObjects:count:
быстрее .При очень большом количестве объектов эта разница может стать значительной .
Редактировать (6 марта 2014 г.):
Дополнительная информация о производительности инициализации массива: http://ciechanowski.me/blog/2014/03/05/exposing-nsmutablearray/:
. Давайте выделим новые массивы с начальной емкостью, равной двум последовательным степеням:
for (int i = 0; i < 16; i++) {
NSLog(@"%@", [[[NSMutableArray alloc] initWithCapacity:1 << i] explored_description]);
}
Сюрприз-сюрприз:
size: 2 // requested capacity: 1
size: 2 // requested capacity: 2
size: 4 // requested capacity: 4
size: 8 // requested capacity: 8
size: 16 // requested capacity: 16
size: 16 // requested capacity: 32
size: 16 // requested capacity: 64
size: 16 // requested capacity: 128
...
// 'size: 16' all the way down