【发布时间】:2012-09-13 16:26:06
【问题描述】:
我找不到有关 ARC 对现实项目的性能影响的客观研究。 The official doc 说
编译器有效地消除了许多无关的保留/释放调用,并且已投入大量精力来加速 Objective-C 运行时。特别是,当方法的调用者是 ARC 代码时,常见的“返回一个保留/自动释放的对象”模式要快得多,并且实际上并没有将对象放入自动释放池中。
已被技术迷转述/变形为“ARC 更快”。
我确定的就是我所测量的。我们最近将我们的 iOS 项目迁移到 ARC,我在代码的一些 CPU 密集型区域之前/之后进行了一些性能测量(生产代码,当然是使用 -Os 标志编译的)。
我观察到 70%(是 70%)的性能回归。使用 Instruments 跟踪保留/释放事件,我意识到编译器在您不会执行此操作的区域(在 ARC 之前的环境中)引入了很多保留/释放对。基本上,任何暂时的都会变强。我相信这就是性能回归的根源。
迁移之前的原始代码已经非常优化。几乎没有完成任何自动释放。因此,切换到 ARC 几乎没有改进空间。
幸运的是,Instruments 能够向我展示 ARC 引入的最昂贵的保留/释放,并且我能够使用 __unsafe_unretained 停用它们。这略微缓解了性能回归。
是否有人知道有关此技术或其他技术以避免性能损失的任何信息? (除了停用 ARC)
谢谢。
编辑: 我并不是说 ARC 因为性能影响而不好。使用 ARC 的优势在很大程度上优于性能回归(在我们的代码中,回归没有任何可见的效果,所以我放弃了)。我认为 ARC 是一项非常好的技术。我永远不会回到MRC。我更多是出于好奇而问这个问题。
我只是对有关该主题的绝大多数博客(例如hereand there)有点恼火,它们或多或少给人的印象是 ARC 代码将比 MRC 代码更快(我以前相信我把手放在它上面)。我真的觉得在一些微基准测试之外情况并非如此。充其量你可以希望与 MRC 相提并论,而不是更快。我做了一些其他涉及对象操作的简单测试(比如计算文档中的单词)。每次 ARC 都变慢(认为不如我最初所说的 70% 性能回归那么糟糕)
\begin{讽刺}
事实上,上述文档确实回答了这个问题:
ARC 慢吗?
这取决于您要测量的内容,但通常“不”。 ...
显然应该理解为
\begin{模仿}
嗯......嗯......我们不能说它慢,因为这是一种新的酷技术,我们希望你采用它。因此,我们用双引号回答“否”只是为了避免集体诉讼。别再问愚蠢的问题了。
\end{模仿}
\end{讽刺}
【问题讨论】:
-
@H2CO3 我不认为 ARC 是垃圾......这只是你的意见,我宁愿认为这是以更简单/更好的方式管理内存的巨大努力,它是一个前沿可以替代 GC 的编译器技术 ...
-
ARC 确实为我节省了很多打字时间。怎么样?
-
@H2CO3 你真的不是 ARC 的粉丝,是吗 ;-) 你有博客文章或任何地方说明你的理由吗?我很想见他们。我经常在 ARC 和 MRC 代码库之间切换,并且 far 更喜欢 ARC。
-
你写博客了吗?如果是这样,我们可以正面交锋。我将一劳永逸地进行 ARC/MRC 性能比较。我已经揭穿了 ARC 神话learn-cocos2d.com/2012/06/mythbusting-8-reasons-arc 以及您需要了解的内容learn-cocos2d.com/2011/11/everything-know-about-arc 在任何应用程序中可能只有不到 1% 的代码可以从手动调整的 MRC 代码中受益,而对于这些区域,您可以禁用 ARC一个文件。由于对性能损失的模糊概念,没有理由对剩下的 99% 进行自虐。
-
保存打字让我觉得 ARC 的一个肤浅的理由。我对使用它的强烈偏好是由于我认识到我自己的人性错误。在过去的十年中,我在许多项目中编写了大量的 objc 代码,尽管如此,我发现我仍然无法可靠地编写无错误的代码。 ARC 以对 MRC 的理解和性能分析工具(这可能会导致偶尔出现 ARC 禁用文件)为后盾,让我离理想更近了一点。
标签: objective-c performance automatic-ref-counting