Производительность, затронутая путем добавления категорий к классу

" , Почему Мерзавец Лучше, чем X " основы различные за и против Мерзавца по сравнению с другим SCMs.

Кратко:

  • дорожки Мерзавца содержание, а не файлы
  • Ответвления легки , и слияние легко , и я имею в виду действительно легкий .
  • Это распределяется, в основном каждый репозиторий является ответвлением. Намного легче разработать одновременно и совместно, чем с Подверсией, по-моему. Это также делает в режиме офлайн разработка возможный.
  • Это не налагает рабочего процесса , как замечено на вышеупомянутый связанный веб-сайт , существует много рабочих процессов, возможных с Мерзавцем. Рабочему процессу стиля Подверсии легко подражают.
  • репозитории Мерзавца очень меньшего размера в размере файла , чем репозитории Подверсии. Существует только один ".git" каталог, в противоположность десяткам ".svn" репозиториев (отметьте Подверсию 1.7 и выше теперь использование единственный каталог как Мерзавец.)
  • подготовка область является потрясающей, она позволяет Вам видеть изменения, Вы будете фиксировать, фиксировать частичные изменения и делать различный другой материал.
  • Прячущий неоценим, когда Вы делаете "хаотическую" разработку или просто хотите исправить ошибку, в то время как Вы все еще работаете над чем-то еще (на другом ответвлении).
  • Вы можете переписывать историю , который является большим для подготовки наборов патча и фиксации Ваших ошибок ( прежде , Вы публикуете фиксации)
  • †¦ и партия [еще 1111].

существуют некоторые недостатки:

  • еще нет многих хороших графический интерфейсов пользователя для него. Это является новым, и Подверсия была вокруг для намного дольше, таким образом, это естественно, поскольку существует несколько интерфейсов в разработке. Некоторые хорошие включают TortoiseGit и GitHub для Mac.
  • контроль/клоны Partial репозиториев не возможен в данный момент (я считал, что это находится в разработке). Однако существует поддержка подмодуля. Мерзавец 1.7 + поддерживает редкий контроль .
  • могло бы быть более трудно учиться, даже при том, что я не нашел, что это имело место (приблизительно год назад). Мерзавец недавно улучшил его интерфейс и довольно удобен для пользователя.

В самом упрощенном использовании, Подверсия и Мерзавец являются в значительной степени тем же. Нет большого различия между:

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

то, Где Мерзавец действительно блистает, переходит и работает с другими людьми.

9
задан Quinn Taylor 24 August 2009 в 16:47
поделиться

3 ответа

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

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

8
ответ дан 4 December 2019 в 11:07
поделиться

Если вы новичок в Cocoa, вам не о чем беспокоиться. Помимо основного правила не делать предположений о производительности без профилирования.

Если вам нужно предоставить функциональность, вы добавляете ее там, где можете. Если есть смысл расширить класс, сделайте это. Если вы не добавите функциональность в NSString, вам придется предоставить ее в другом месте. Если вы сделаете это в другом классе, это добавит другой уровень сложности.

Лично я бы побеспокоился о дизайне вашего приложения. Используйте категорию, если это имеет смысл, и если вас действительно беспокоит производительность, профилируйте свое приложение, как только оно заработает.

И хотя я делаю здесь предположение, я бы сказал, что, скорее всего, ваши производительность приложения, чем скорость обращений к NSString. Если только

4
ответ дан 4 December 2019 в 11:07
поделиться

Как правило, номер

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 была запатентована ... Думаю, вы действительно можете получить патент на что угодно. Я собираюсь запатентовать алфавит и зарядиться большим, детка!

7
ответ дан 4 December 2019 в 11:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: