Я не смог найти объективное исследование влияния производительности ARC в реальном проекте. Официальный документ сообщает
Компилятор эффективно устраняет многие посторонние вызовы сохранения/выпуска и прилагает большие усилия для ускорения работы в среде Objective-C в целом. В частности, общий шаблон "вернуть сохраненный/автореализованный объект" намного быстрее и фактически не помещает объект в пул автозаполнения, когда вызывающим объектом метода является код ARC.
который был передан/деформирован tech-fanboys в "ARC быстрее".
То, что я точно знаю, это то, что я измерил. Недавно мы перенесли проект iOS в ARC, и я сделал некоторые измерения производительности до/после в некоторой области интенсивного процессора нашего кода (производственный код, скомпилированный с флагом -Os
, конечно).
Я наблюдал регрессию производительности 70% (да 70%). Используя инструменты для отслеживания событий сохранения/выпуска, я понял, что компилятор вводит много пар сохранения/выпуска в области, где вы этого не сделали бы (в среде pre ARC). В принципе, любое временное становится сильным. То есть, я считаю, источником регрессии производительности.
Исходный код перед переносом был уже оптимизирован. Практически не было сделано никакого автореферата. Следовательно, было мало возможностей для улучшения, переключившись на ARC.
К счастью, инструменты смогли показать мне самый дорогостоящий удержание/выпуск, введенный ARC, и я смог отключить их, используя __unsafe_unretained. Это немного снижает регрессию производительности.
Есть ли у кого-нибудь информация об этой или иной технике, чтобы избежать потери производительности? (кроме деактивации ARC)
Спасибо.
EDIT: Я не говорю, что ARC плохо из-за воздействия производительности. Преимущество использования ARC в значительной степени превосходит регрессию производительности (в нашем коде регрессия не имела никакого видимого эффекта, поэтому я ее отпустил). Я считаю ARC очень хорошей технологией. Я никогда не вернусь в MRC. Я задаю этот вопрос больше любопытством.
Меня просто немного раздражает подавляющее большинство блогов по этой теме (например здесь и там), что более или менее создает впечатление, что код ARC будет быстрее кода MRC (что-то, к чему я верил, прежде чем я на него надел). И у меня действительно есть ощущение, что это не так, как в некоторых микро-тестах. В лучшем случае вы можете надеяться быть наравне с MRC, а не быстрее. Я сделал несколько других простых тестов, связанных с манипуляциями с объектами (например, счетным словом в документах). Каждый раз, когда ARC была медленнее (считалось не так плохо, как 70% -ная регрессия, о которой я говорил первоначально)
\ {начать сарказм}
Фактически, вышеупомянутый документ действительно ответил на вопрос:
Является ли ARC медленным?
Это зависит от того, что вы измеряете, но обычно "нет"....
который, очевидно, следует понимать как
\ начать {пародия}
Ну... гул... мы не можем сказать это медленнее, потому что это новый классный техно, и мы хотели бы, чтобы вы его приняли. Поэтому мы отвечаем "нет" двойными кавычками, чтобы избежать действия класса. И перестаньте задавать глупые вопросы.
\ конец {пародия}
\ конец {сарказм}