Стоит ли неатомное того?

#cocoa-touch #performance

#cocoa-touch #Производительность

Вопрос:

Я много раз видел, как @property определялся как неатомный по соображениям производительности. Есть ли какие-либо доказательства того, что это того стоит?

Ответ №1:

Когда свойство не объявлено как nonatomic , синтезированный инструмент доступа будет использовать блокировки, чтобы гарантировать потокобезопасность свойства. Когда блокировка используется без необходимости, она добавляет ненужные сообщения в вашу программу. Сама операция блокировки также должна быть атомарной, что означает, что процессор заблокирует шину памяти. Это может замедлить работу вашей программы, а также других. Если к свойству обращаются нечасто, вы, вероятно, не заметите разницы, но вы определенно захотите использовать его, если свойство будет использоваться часто. В целом, однако, почему бы не использовать его? Это несколько дополнительных символов, которые потенциально могут ускорить работу вашей программы.

Комментарии:

1. На самом деле меня беспокоит, стоит ли риск столкнуться с каким-либо тупиковым состоянием / состоянием гонки / чем угодно, чтобы это дополнительное повышение производительности.

2. Вы никогда не должны использовать nonatomic то, что может быть использовано в нескольких потоках. Думаю, я предположил, что это очевидно, поскольку атомарность важна, когда к чему-то можно получить доступ несколькими потоками, и вы спрашивали, выгодно ли использовать это в однопоточных приложениях.

3. Вопрос был «стоит ли оно того?» — и на этот вопрос нельзя ответить, не измерив конкретный код.

4. @James Вот почему я не сказал ни да, ни нет. Я описал причины, по которым это может принести пользу, и указал, что нет причин не использовать это, когда вы можете. Не похоже, что для этого требуется рефакторинг всей программы. Я мог бы ответить аналогичным образом на вопрос типа «Стоит ли не размещать sleep(1) после каждого оператора?».

5. @ughoavgfhw, мне следовало более решительно изложить свою позицию. Добавлять неатомное неправильно до тех пор, пока вы не измерите его фактическое влияние на свой собственный код. nonatomic — это дополнительный код, который следует добавлять только при необходимости. Другими словами, преждевременная оптимизация неверна — и это именно то, что означает добавление неатомного.