実際のプロジェクトにおける ARC パフォーマンスの影響に関する客観的な研究は見つかりませんでした。 公式ドキュメントによると
コンパイラは多くの余分な保持/解放呼び出しを効率的に排除し、Objective-C ランタイム全般の高速化に多くの努力が注がれています。特に、一般的な「retain/autoreleased オブジェクトを返す」パターンははるかに高速であり、メソッドの呼び出し元が ARC コードの場合、実際にはオブジェクトを自動解放プールに入れません。
これは、ハイテクファンボーイによって「ARCの方が速い」に中継/変形されました。
私が確かに知っていることは、私が測定したものです。-Os
最近、iOS プロジェクトを ARC に移行し、コードの一部の CPU 集中型領域 (もちろん、フラグを使用してコンパイルされた製品コード) の前後でパフォーマンス測定を行いました。
70% (はい 70%) のパフォーマンス低下が見られました。インストルメントを使用して保持/解放イベントを追跡すると、(ARC 以前の環境では) 実行しない領域にコンパイラが多数の保持/解放ペアを導入することに気付きました。基本的にどんな一時でも強くなります。それがパフォーマンス低下の原因だと思います。
移行前の元のコードは、すでにかなり最適化されていました。自動解放はほとんど行われませんでした。したがって、ARC に切り替えても改善の余地はほとんどありませんでした。
幸いなことに、Instrumentsは、ARC によって導入された最もコストのかかる保持/解放を表示することができ、__unsafe_unretained を使用してそれらを非アクティブ化することができました。これにより、パフォーマンスの低下がわずかに緩和されます。
パフォーマンスの低下を回避するためのこの手法またはその他の手法に関する情報はありますか? (ARC の無効化は別として)
ありがとう。
編集:パフォーマンスへの影響のためにARCが悪いと言っているのではありません。ARC を使用する利点は、パフォーマンスの回帰よりもはるかに優れています (私たちのコードでは、回帰は目に見える効果がなかったため、手放しました)。ARC は非常に優れたテクノロジーだと思います。MRCには二度と戻りません。私は好奇心からこの質問をしています。
私は、多かれ少なかれARCコードがMRCコードよりも高速になるという印象を与えるトピックに関する大多数のブログ(ここ とそこのような)に少しイライラしています(私がそれを手に入れる前に私が信じていたことです) )。そして、これはいくつかのマイクロベンチマーク以外では当てはまらないと本当に感じています. せいぜい、MRC と同等であることを期待できますが、それより速くはなりません。オブジェクト操作 (ドキュメント内の単語のカウントなど) を含むいくつかの簡単なテストを行いました。ARCが遅くなるたびに(最初に話していた70%のパフォーマンス低下ほど悪くないと思いました)
\begin{皮肉}
実際、前述のドキュメントは質問に答えました:
ARCは遅いですか?
何を測定しているかにもよりますが、一般的には「いいえ」です。...
これは明らかに次のように理解されるべきです
\begin{パロディ}
うーん...うーん...これは新しいクールなテクノであり、採用してもらいたいので、遅いとは言えません。したがって、集団訴訟を避けるために、二重引用符で「いいえ」と答えます。そしてくだらない質問はやめましょう。
\end{パロディ}
\end{皮肉}