我找不到关于 ARC 在现实项目中的性能影响的客观研究。 官方文档说
编译器有效地消除了许多无关的保留/释放调用,并且已经投入了大量精力来加速 Objective-C 运行时。特别是,当方法的调用者是 ARC 代码时,常见的“返回一个保留/自动释放对象”模式要快得多,并且实际上并没有将对象放入自动释放池中。
它已被技术迷转达/变形为“ARC 更快”。
我确定的就是我测量的。我们最近将我们的 iOS 项目迁移到 ARC,我在代码的一些 CPU 密集型区域之前/之后进行了一些性能测量(生产代码,-Os
当然是使用标志编译的)。
我观察到 70%(是 70%)的性能回归。使用Instruments跟踪保留/释放事件,我意识到编译器在你不会做的区域(在 ARC 之前的环境中)引入了很多保留/释放对。基本上,任何暂时的都会变强。那就是,我相信,性能回归的根源。
迁移之前的原始代码已经非常优化。几乎没有完成任何自动释放。因此,切换到 ARC 几乎没有改进的余地。
幸运的是,Instruments能够向我展示 ARC 引入的最昂贵的保留/释放,并且我能够使用 __unsafe_unretained 停用它们。这略微减轻了性能回归。
有没有人有关于这种或其他技术的任何信息来避免性能损失?(除了停用 ARC)
谢谢。
编辑:我并不是说 ARC 因为性能影响而不好。使用 ARC 的优势在很大程度上优于性能回归(在我们的代码中,回归没有任何明显的效果,所以我放弃了)。我认为 ARC 是一项非常好的技术。我永远不会回到MRC。我更多是出于好奇而问这个问题。
绝大多数关于该主题的博客(比如这里 和那里)都或多或少地给人一种印象,即 ARC 代码将比 MRC 代码更快(这是我在动手之前就相信的),这让我有点恼火)。我真的觉得在一些微基准测试之外情况并非如此。充其量你可以希望与 MRC 相提并论,而不是更快。我做了一些其他涉及对象操作的简单测试(比如计算文档中的单词)。每次 ARC 变慢时(认为不如我最初所说的 70% 性能回归那么糟糕)
\开始{讽刺}
事实上,上述文档确实回答了这个问题:
ARC慢吗?
这取决于您要测量的内容,但通常是“否”。...
这显然应该理解为
\开始{模仿}
嗯......嗯......我们不能说它更慢,因为这是一种新的很酷的技术,我们希望你采用它。因此,我们用双引号回答“否”只是为了避免集体诉讼。别再问愚蠢的问题了。
\结束{模仿}
\结束{讽刺}