" , Почему Мерзавец Лучше, чем X " основы различные за и против Мерзавца по сравнению с другим SCMs.
Кратко:
существуют некоторые недостатки:
В самом упрощенном использовании, Подверсия и Мерзавец являются в значительной степени тем же. Нет большого различия между:
svn checkout svn://foo.com/bar bar
cd bar
# edit
svn commit -m "foo"
и
git clone git@github.com:foo/bar.git
cd bar
# edit
git commit -a -m "foo"
git push
то, Где Мерзавец действительно блистает, переходит и работает с другими людьми.
Все методы отправляются с использованием динамической диспетчеризации, чтобы в сообщениях методы категорий не мешали «нормальным» сообщениям.
С точки зрения производительности среда выполнения обрабатывает связывание методов с классом в вопросе, поэтому за это взимается единовременная плата, но нет никаких изменений для каждого отдельного объекта. Я бы не стал беспокоиться о производительности с категориями, но вместо этого был бы осторожен, чтобы убедиться, что методы, которые вы добавляете через категории, не включают методы по умолчанию или методы, указанные в других категориях. Вот где обычно начинаются проблемы.
Если вы новичок в Cocoa, вам не о чем беспокоиться. Помимо основного правила не делать предположений о производительности без профилирования.
Если вам нужно предоставить функциональность, вы добавляете ее там, где можете. Если есть смысл расширить класс, сделайте это. Если вы не добавите функциональность в NSString, вам придется предоставить ее в другом месте. Если вы сделаете это в другом классе, это добавит другой уровень сложности.
Лично я бы побеспокоился о дизайне вашего приложения. Используйте категорию, если это имеет смысл, и если вас действительно беспокоит производительность, профилируйте свое приложение, как только оно заработает.
И хотя я делаю здесь предположение, я бы сказал, что, скорее всего, ваши производительность приложения, чем скорость обращений к NSString. Если только
Как правило, номер
objc_msgSend ()
сохраняет псевдо-наименее недавно использованный кеш последнего SEL
- IMP
выполняет поиск для каждого класса. Как всегда, специфика - это «частные детали реализации», но разумно сказать, что время поиска составляет в среднем ~ O (1)
, независимо от количества селекторов. Чаще всего это делается с помощью небольшой хеш-таблицы - если селектор находится в кеше, то отправка происходит практически мгновенно. Если селектора нет в кэше, ему необходимо выполнить дорогостоящий поиск «медленного пути».
Однако, даже «медленный путь» может быть достаточно быстрым. Существует любое количество структур данных, к которым можно обратиться, например, Red Black Trees, которые предлагают отличное время субэкспоненциального поиска, которое хорошо масштабируется независимо от количества селекторов - обычно в O (log2 (selectorCount))
диапазон. Опять же, то, как libobjc
обрабатывает такие детали, является частным, но существует так много структур данных, которые легко масштабируются независимо от количества элементов для поиска, что нет причин, по которым подобные вещи должны быть на вашем сайте. радар.
Быстрая проверка с помощью нм
открывает 7771 селектор в Foundation и 27510 селекторов в AppKit, всего 35281 селектор только между ними. Добавьте QuickTime, CoreData, WebKit, Quartz, и вы легко сможете выбрать до 50K селекторов. При увеличении времени поиска log2
удвоение количества селекторов увеличит время наихудшего случая менее чем на 10%.
В итоге: objc_msgSend ()
использует небольшой хэш на основе кеша для обеспечения O (1)
времени поиска для последних использованных селекторов ... и существует очень высокая степень временной локальности, поэтому подавляющее большинство диспетчеризации завершается за O ( 1)
время независимо от количества селекторов, присутствующих в системе. Естественный эффект кеширования - «настраиваться» на ваши конкретные шаблоны использования. Даже при промахе в кэше, вероятно, разумно предположить, что время поиска в худшем случае составляет ~ O (log2 (selectorCount))
, что довольно хорошо, и, вероятно, лучше, чем на практике.
Чего это стоит, я я потратил много времени на настройку кода для повышения скорости. Даже в многопоточном материале, где я привязываю все процессоры, выполняющие огромный объем анализа -> рендеринг тяжелых результатов NSView / OpenGL, все закодированы в Objective-C, я только увижу, что objc_msgSend ()
занимает 1 -4 процента ЦП при профилировании с помощью Shark.app
... и это худший случай, когда выполняется тяжелая отправка сообщений Objective-C. Для меня это никогда не было проблемой, и какое бы незначительное снижение скорости ни имелось, оно легко компенсируется 100-кратной производительностью программирования.
См. Также:
Mulle kybernetiK- Оптимизация Obj-C: более быстрый objc_msgSend
Руководство по программированию среды выполнения Objective-C 2.0 - Обмен сообщениями
Среда выполнения Apple Objective-C - objc4-437.tar.gz
РЕДАКТИРОВАТЬ : Как это странно: Патент 5960197 - Функция диспетчеризации компилятора для объектно-ориентированного языка C . Не могу сказать, что я знал, что вся система отправки сообщений Obj-C была запатентована ... Думаю, вы действительно можете получить патент на что угодно. Я собираюсь запатентовать алфавит и зарядиться большим, детка!