NSMutableArray initWithCapacity нюансы - PullRequest
       8

NSMutableArray initWithCapacity нюансы

26 голосов
/ 16 октября 2010

Есть ли у кого-нибудь советы о том, как лучше всего инициализировать NSMutableArray, когда дело доходит до определения емкости?В документации упоминается, что «... даже если вы задаете размер при создании массива, указанный размер рассматривается как« подсказка »; фактический размер массива по-прежнему равен 0».Итак ...

1) Если я инициализирую с большей емкостью, чем обычно использую, не нужно ли мне беспокоиться о потраченной памяти?

2) Если я инициализирую с емкостью нижечем то, что я использую, нужно ли мне беспокоиться о более длительном времени обработки, выделяя больше памяти для хранения дополнительных элементов?

Насколько эта инициализированная емкость влияет на производительность / использование памяти этим типом данных?

Ответы [ 2 ]

41 голосов
/ 16 октября 2010

Мэтт Галлахер написал довольно информативную статью о классах коллекций Какао, а также несколько тестов (с 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
15 голосов
/ 16 октября 2010

То, было ли потрачено какое-то место из-за слишком большой емкости, на самом деле является деталью реализации, которую, я думаю, Apple намеренно не раскрывает. NSMutableArray - это кластер классов, что означает, что вы на самом деле не получаете экземпляр NSMutableArray, а какой-то другой специализированный класс, следующий тому же интерфейсу. И Apple не сообщает вам, какой класс возвращается, в каком случае и как он себя ведет. Поэтому здесь трудно давать реальные советы.

Если вы действительно знаете, что в среднем вам понадобится емкость X , просто используйте ее. В противном случае, если у вас нет проблем с производительностью, я бы вообще не заботился о емкости и просто использовал [NSMutableArray array] ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...