Предположим, что я хочу использовать массивы C-стиля NSObjects вместо NSArray. Имеет ли это какие-либо штрафы за производительность за использование NSArray?Использование массивов C-стиля в Objective-C
ответ
Несмотря на то, что для него нет штрафа за производительность, есть определенная потеря гибкости: в отличие от NSMutableArray
s, ваши C-массивы имеют фиксированный размер. Вы не сможете использовать быстрое перечисление с массивами C, тоже прибегая к использованию индексов массива.
Если эти ограничения в порядке с вашими требованиями, C-массивы должны работать. Они отлично играют с ARC: когда массив сильных ссылок C выходит за рамки, ARC выпускает все экземпляры, которые не установлены в nil
.
Быстрое перечисление на самом деле будет медленнее, чем индексирование в массив C, потому что для быстрого перечисления требуются накладные расходы на отправку сообщений (вызовы функций). Это считается быстрым * относительно старого шаблона NSEnumerator. –
@JonathanGrynspan О, я не хотел подразумевать, что перечисление путем индексирования будет как-то медленнее, чем быстрое перечисление, только то, что красиво выглядящая конструкция 'in: in' будет недоступна. Я согласен, скорость индексирования будет намного быстрее, потому что не будет копирования, которое скрыто внутри реализаций быстрого перечисления. – dasblinkenlight
Отсутствие штрафов за производительность, и в принципе технически должно быть улучшение производительности. То, что вы торгуете, - это довольно много функциональности NSArray
и разумного количества инкапсуляции, что дает вам некоторые синтаксические головные боли и риск утечки памяти, если вы не будете осторожны.
Тем не менее, одно приложение, над которым я работал, включало 2-мерный массив данных. Удобно, что массив был фиксированным размером, известным заранее. Я спрятал логику для этого в пользовательском аналоге NSArray
, который взял двумерные индексы. Ранняя реализация использовала словарь с NSIndexPath
s в качестве ключей. Это было довольно медленно. Я попробовал NSArray
NSArray
s. Это было медленнее. Я попробовал массив 2d C, и это было значительно быстрее. Потребовав время, чтобы сбалансировать мои retain
и release
, не было никаких плохих последствий для производительности.
К сожалению, я обнаружил, что многие классы Foundation довольно медленны при использовании в жестких циклах и в других ситуациях, ориентированных на производительность. Общий ответ заключается в том, что диспетчеризация сообщений выполняется медленно, но различные тесты, которые я запускал на своем собственном коде, показывают, что отправка сообщений добавляет едва ли какие-либо накладные расходы, используя обычные функции C. К сожалению, многие классы Foundation просто тяжело передают много ситуаций. Если вы можете позволить себе потерять много более сложных функций, вы можете создавать и использовать пользовательские классы, которые более жестко контролируют их память и характеристики производительности. – Rabbit
- 1. Использование ObjectiveC объекты с таНосом
- 2. Брус использование @property в ObjectiveC Xcode
- 3. Использование кода Perl в iOS/ObjectiveC
- 4. Статическая переменная в ObjectiveC
- 5. Как проверить значение ключевого значения в ObjectiveC для словаря массивов?
- 6. Использование TwitPic API от ObjectiveC/iPhone
- 7. Использование библиотеки ObjectiveC in React Native
- 8. Как проверить содержимое массивов? Разбор XML-файл с ObjectiveC
- 9. Использование массивов в preg_match()
- 10. Использование массивов в Swift
- 11. Использование массивов в Simple_form
- 12. Использование массивов в циклах
- 13. Использование массивов в SAS
- 14. Использование массивов в строках
- 15. Использование массивов в методах?
- 16. Использование массивов в MIPs
- 17. Использование массивов в Vb.net
- 18. Использование массивов в JavaScript
- 19. Использование массивов в str_replace
- 20. Использование массивов в Java
- 21. Использование массивов в Ajax
- 22. Swift framework в проекте ObjectiveC
- 23. Использование чисел в виде массивов вспомогательных массивов
- 24. ObjectiveC NSURLSessionDownloadTask
- 25. Объединить строки в ObjectiveC
- 26. Передача переменных в ObjectiveC
- 27. Вычисление пересечения в ObjectiveC
- 28. NSString вопрос в ObjectiveC
- 29. AMF0 парсер в ObjectiveC
- 30. NumberFormatter - ObjectiveC
Я так не верю. Для большинства подобных вещей существуют беспошлинные мосты. – onnoweb
@onnoweb: между объектами Core Foundation и объектами Foundation используются «беспошлинные мосты», концепция не распространяется ни на что другое. –
Ahh, хороший момент. – onnoweb