В чем смысл емкости сбора в Objective-C?

Недавно я использовал Objective-C, и, исходя из мира C++, я не понимаю смысла указывать емкость для собственных коллекций Objective-C.

В C++ контейнеры могут быть заполнены объектами или ссылочными типами (например, ссылочными обертками или указателями), поэтому указание начальной емкости имеет смысл, поскольку предварительное выделение памяти для последовательности больших объектов может быть затруднено. большое улучшение производительности. Однако в Objective-C коллекции могут содержать только ссылки на динамически размещаемые объекты, т. е. указатели. Как следствие, мне интересно, какое преимущество в производительности от указания емкости, если в худшем случае нужно будет скопировать только указатели, если размер коллекции превысит исходную емкость.

Ясно, что мне не хватает понимания модели памяти, так что же я упускаю?


person tunnuz    schedule 01.10.2014    source источник
comment
Да, в Objective-C эффект меньше, чем в C++, потому что это только указатели. Но по-прежнему существует ненужное выделение/освобождение/фрагментация/копирование памяти из-за изменения размера, что может повлиять на производительность в критически важном для производительности коде, таком как длинные циклы.   -  person fluidsonic    schedule 01.10.2014
comment
Вы, наверное, правы. Это небольшая оптимизация, поскольку, если коллекцию нужно увеличить, realloc и memcpy предназначены только для указателей, а не для объектов.   -  person rmaddy    schedule 01.10.2014
comment
Я подозреваю, что возможность указать начальную емкость существует в основном потому, что некоторые люди думают, что это приносит пользу, и требуют этого.   -  person Hot Licks    schedule 01.10.2014
comment
На самом деле было бы полезно указать емкость k, если initWithCapacity будет использовать инициализацию по умолчанию типа значения для создания экземпляров k идентичных элементов. Но такого метода нет.   -  person tunnuz    schedule 01.10.2014
comment
@fluidsonic: верно, еще есть указатели, которые нужно скопировать, но мне интересно, действительно ли это стоит усилий для типичного приложения Objective-C.   -  person tunnuz    schedule 01.10.2014
comment
@tunnuz: да, особенно. поскольку речь идет не только о копировании, но и о выделении, освобождении и фрагментации. Объединение всех четырех задач может быстро привести к большому объему работы в цикле.   -  person fluidsonic    schedule 01.10.2014
comment
Хорошо, если кто-нибудь из вас может дать развернутый ответ (@fluidsonic, вы, кажется, хорошо разбираетесь в вопросе), я могу пометить вопрос как отвеченный.   -  person tunnuz    schedule 01.10.2014
comment
@tunnez: просто обратитесь к stackoverflow.com/a/12031319/1183577, что является хорошим объяснением   -  person fluidsonic    schedule 01.10.2014
comment
Просто чтобы убедиться, что вы знаете: вам не нужно использовать методы ...WithCapacity: для создания объектов коллекции. Некоторые люди смотрят на справочник класса, скажем, NSMutableArray и видят только один удобный конструктор: +arrayWithCapacity:. Они предполагают, что это единственное доступное, забывая, что NSMutableArray наследует все методы своих суперклассов. Поскольку NSArray предоставляет +array (и другие), они также доступны для использования с NSMutableArray.   -  person Ken Thomases    schedule 01.10.2014
comment
@KenThomases: спасибо, что указали на это. Конечно, есть простой init. Мне просто интересно, имело ли добавление параметра емкости какой-то эффект, о котором я не знал, поскольку сохранение выделения/освобождения указателей само по себе не казалось достаточно веской причиной (но Fluidsonic правильно указал, что это может быть все еще улучшение производительности в определенных ситуациях).   -  person tunnuz    schedule 01.10.2014


Ответы (1)


Многие методы Cocoa были реализованы в OS X в ее первоначальном выпуске и, вполне возможно, были реализованы еще в OpenStep или даже в NextStep. Это означает, что они, возможно, сыграли значительную роль в повышении производительности 32-разрядного процессора Motorola 68030 с тактовой частотой 25 МГц прошлого года. Начинающие программисты могут быть избалованы современными машинами с гигабайтами памяти и циклами процессора, измеряемыми в гигагерцах, но опытные программисты старшего возраста разработали множество высокопроизводительных приложений на машинах с памятью, мощностью процессора и пропускной способностью памяти на порядок меньше, чем у современных машин. Возможно, было бы чрезвычайно выгодно сэкономить время перераспределения памяти для тысяч добавлений массива, заблаговременно выделив требуемую память.

Я прошу прощения за то, что не могу просто добавить комментарий к сообщению OP, но я чувствовал, что идея использования устаревших версий требует дополнительной точки зрения. Всегда полезно изучить заголовки и отметить, когда тот или иной конкретный метод был изначально доступен, потому что в прошлом он мог иметь большое значение.

Обновление: из того, что я могу найти в Интернете в общедоступных документах разработчиков NextStep, похоже, что NSMutableArray -initWithCapacity: и + arrayWithCapacity: были реализованы по крайней мере еще в 1994 году в NextStep 3.3.

person bergdesign    schedule 01.10.2014