Синтаксис и семантика уже хорошо определены другими превосходными ответами на этот вопрос. Поскольку исполнение и производительность не детализированы, я добавлю свой ответ.
В чем функциональная разница между этими 3?
Я всегда считал атомную по умолчанию довольно любопытной. На уровне абстракции, над которым мы работаем, использование атомарных свойств для класса в качестве транспортного средства для достижения 100% -ной безопасности потока является ключевым случаем. Для действительно правильных многопоточных программ вмешательство программиста почти наверняка является требованием. Между тем, характеристики производительности и исполнения еще не были подробно описаны. Написав несколько многопоточных программ за эти годы, я все время заявлял о своих свойствах, nonatomic
потому что atomic не был пригоден для каких-либо целей. Во время обсуждения деталей атомных и неатомных свойств этого вопроса я при профилировании столкнулся с некоторыми любопытными результатами.
выполнение
Хорошо. Первое, что я хотел бы прояснить, это то, что реализация блокировки определяется реализацией и абстрагируется. Луи использует @synchronized(self)
в своем примере - я видел это как общий источник путаницы. Реализация на самом деле не использует @synchronized(self)
; он использует спин-блокировки на уровне объекта . Иллюстрация Луи хороша для иллюстрации высокого уровня с использованием конструкций, с которыми мы все знакомы, но важно знать, что она не используется @synchronized(self)
.
Другое отличие состоит в том, что атомарные свойства будут сохранять / освобождать цикл ваших объектов в геттере.
Представление
Вот интересная часть: производительность, использующая доступ к элементарным свойствам в неоспоримых (например, однопоточных) случаях, в некоторых случаях может быть действительно очень высокой. В далеко не идеальных случаях использование атомарного доступа может стоить более чем в 20 раз дороже nonatomic
. В случае оспариваемого случая, использующего 7 потоков, для трехбайтовой структуры было в 44 раза медленнее (2,2 ГГц Core i7 Quad Core, x86_64). Трехбайтовая структура является примером очень медленного свойства.
Интересное примечание: определяемые пользователем средства доступа трехбайтовой структуры были в 52 раза быстрее, чем синтезированные атомарные средства доступа; или 84% скорости синтезированных неатомных акцессоров.
Объекты в оспариваемых случаях также могут превышать 50 раз.
Из-за большого количества оптимизаций и вариаций в реализации очень сложно измерить реальные воздействия в этих контекстах. Вы можете часто слышать что-то вроде «Доверяйте этому, если вы не профилируете и не обнаружите, что это проблема». Из-за уровня абстракции, на самом деле довольно сложно измерить фактическое влияние. Сбор фактических затрат из профилей может занять очень много времени, а из-за абстракций довольно неточен. Кроме того, ARC против MRC может иметь большое значение.
Итак, давайте сделаем шаг назад, не сосредотачиваясь на реализации доступа к свойствам, мы включим обычные подозреваемые, такие как objc_msgSend
, и исследуем некоторые реальные результаты высокого уровня для многих вызовов NSString
геттера в неоспоримом случаях (значения в секундах):
- MRC | неатомный | Внедренные вручную геттеры: 2
- MRC | неатомный | синтезированный геттер: 7
- MRC | атомный | синтезированный геттер: 47
- ARC | неатомный | синтезированный геттер: 38 (примечание: ARC добавляет количество циклов отсчета здесь)
- ARC | атомный | синтезированный геттер: 47
Как вы, наверное, догадались, активность / циклический подсчет ссылок вносит существенный вклад в атомарность и в ARC. Вы также увидите большие различия в спорных случаях.
Хотя я уделяю пристальное внимание производительности, я по-прежнему говорю Semantics First! , Между тем, производительность является низким приоритетом для многих проектов. Однако знание деталей исполнения и стоимости используемых вами технологий, безусловно, не повредит. Вы должны использовать правильную технологию для ваших потребностей, целей и способностей. Надеемся, что это сэкономит вам несколько часов сравнений и поможет вам принять более обоснованное решение при разработке ваших программ.