В общем, нет.
objc_msgSend()
хранит псевдо-наименьший недавно использованный кеш самых последних поисков от SEL
до IMP
для каждого класса. Как всегда, специфика - это «частные детали реализации», но разумно сказать, что время поиска составляет в среднем ~ O(1)
, независимо от количества селекторов. Наиболее распространенный способ сделать это - с помощью небольшой хеш-таблицы - если селектор находится в кеше, тогда отправка происходит по существу мгновенно. Если селектор отсутствует в кэше, он должен выполнить дорогой поиск по «медленному пути».
Однако даже «медленный путь» может быть достаточно быстрым. Существует любое количество структур данных, к которым можно обратиться, таких как «Красные черные деревья», которые предлагают превосходные субэкспоненциальные времена поиска, которые хорошо масштабируются независимо от количества селекторов - как правило, в диапазоне O(log2(selectorCount))
. Опять же, то, как libobjc
имеет дело с подобными деталями, является частным, но существует так много структур данных, которые легко масштабируются независимо от количества элементов для поиска, поэтому нет никаких причин, по которым подобные вещи должны даже присутствовать на вашем радаре.
Быстрая проверка с помощью nm
включает 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 процента CPU когда профилируется с Shark.app
... и это худший случай, когда выполняется интенсивная диспетчеризация сообщений Objective-C. Для меня это никогда не было проблемой, и, несмотря на незначительные потери в скорости, это легко компенсируется производительностью программирования в 100 раз.
Смотри также:
Mulle kybernetiK - Оптимизация Obj-C: чем быстрее objc_msgSend
Руководство по программированию в Objective-C 2.0 - Обмен сообщениями
Apple Objective-C Runtime - objc4-437.tar.gz
EDIT : Как странно это: Патент 5960197 - Функция отправки компилятором для объектно-ориентированного C . Не могу сказать, что знал, что вся система диспетчеризации сообщений Obj-C была запатентована ... Я думаю, вы действительно можете получить патент на что угодно. Я собираюсь запатентовать алфавит и зарядить большой, детка!