2012-06-29 3 views
3

Предположим, что я хочу использовать массивы C-стиля NSObjects вместо NSArray. Имеет ли это какие-либо штрафы за производительность за использование NSArray?Использование массивов C-стиля в Objective-C

+0

Я так не верю. Для большинства подобных вещей существуют беспошлинные мосты. – onnoweb

+4

@onnoweb: между объектами Core Foundation и объектами Foundation используются «беспошлинные мосты», концепция не распространяется ни на что другое. –

+0

Ahh, хороший момент. – onnoweb

ответ

2

Несмотря на то, что для него нет штрафа за производительность, есть определенная потеря гибкости: в отличие от NSMutableArray s, ваши C-массивы имеют фиксированный размер. Вы не сможете использовать быстрое перечисление с массивами C, тоже прибегая к использованию индексов массива.

Если эти ограничения в порядке с вашими требованиями, C-массивы должны работать. Они отлично играют с ARC: когда массив сильных ссылок C выходит за рамки, ARC выпускает все экземпляры, которые не установлены в nil.

+2

Быстрое перечисление на самом деле будет медленнее, чем индексирование в массив C, потому что для быстрого перечисления требуются накладные расходы на отправку сообщений (вызовы функций). Это считается быстрым * относительно старого шаблона NSEnumerator. –

+1

@JonathanGrynspan О, я не хотел подразумевать, что перечисление путем индексирования будет как-то медленнее, чем быстрое перечисление, только то, что красиво выглядящая конструкция 'in: in' будет недоступна. Я согласен, скорость индексирования будет намного быстрее, потому что не будет копирования, которое скрыто внутри реализаций быстрого перечисления. – dasblinkenlight

3

Отсутствие штрафов за производительность, и в принципе технически должно быть улучшение производительности. То, что вы торгуете, - это довольно много функциональности NSArray и разумного количества инкапсуляции, что дает вам некоторые синтаксические головные боли и риск утечки памяти, если вы не будете осторожны.

Тем не менее, одно приложение, над которым я работал, включало 2-мерный массив данных. Удобно, что массив был фиксированным размером, известным заранее. Я спрятал логику для этого в пользовательском аналоге NSArray, который взял двумерные индексы. Ранняя реализация использовала словарь с NSIndexPath s в качестве ключей. Это было довольно медленно. Я попробовал NSArrayNSArray s. Это было медленнее. Я попробовал массив 2d C, и это было значительно быстрее. Потребовав время, чтобы сбалансировать мои retain и release, не было никаких плохих последствий для производительности.

+1

К сожалению, я обнаружил, что многие классы Foundation довольно медленны при использовании в жестких циклах и в других ситуациях, ориентированных на производительность. Общий ответ заключается в том, что диспетчеризация сообщений выполняется медленно, но различные тесты, которые я запускал на своем собственном коде, показывают, что отправка сообщений добавляет едва ли какие-либо накладные расходы, используя обычные функции C. К сожалению, многие классы Foundation просто тяжело передают много ситуаций. Если вы можете позволить себе потерять много более сложных функций, вы можете создавать и использовать пользовательские классы, которые более жестко контролируют их память и характеристики производительности. – Rabbit

Смежные вопросы