gpt4 book ai didi

objective-c - 是否有任何关于使用 ARC 的性能影响的具体研究?

转载 作者:太空狗 更新时间:2023-10-30 03:22:05 24 4
gpt4 key购买 nike

我找不到关于 ARC 在现实生活项目中的性能影响的客观研究。 The official doc

The compiler efficiently eliminates many extraneous retain/release calls and much effort has been invested in speeding up the Objective-C runtime in general. In particular, the common “return a retain/autoreleased object” pattern is much faster and does not actually put the object into the autorelease pool, when the caller of the method is ARC code.

它已被技术狂热者转发/变形为“ARC 更快”。

我所确定的是我测量的。我们最近将我们的 iOS 项目迁移到 ARC,我在代码的某些 CPU 密集区域之前/之后做了一些性能测量(生产代码,当然是使用 -Os 标志编译的)。

我观察到 70%(是的,70%)的性能下降。使用 Instruments 跟踪保留/释放事件,我意识到编译器在您不会这样做的区域(在 ARC 之前的环境中)引入了很多保留/释放对。基本上,任何临时变强。我认为,这就是性能回归的根源。

原始代码,在迁移之前,已经非常优化了。几乎没有完成任何自动释放。因此,改用 ARC 几乎没有改进的余地。

幸运的是,Instruments 能够向我展示 ARC 引入的成本最高的保留/释放,并且我能够使用 __unsafe_unretained 停用它们。这稍微减轻了性能回归。

有没有人有任何关于这种或其他技术的信息来避免性能损失? (除了停用 ARC)

谢谢。

编辑:我并不是说 ARC 不好是因为性能影响。使用 ARC 的优势在很大程度上优于性能回归(在我们的代码中,回归没有任何可见的效果,所以我放弃了)。我认为 ARC 是一项非常好的技术。我永远不会回到 MRC。我问这个问题更多是出于好奇。

我对绝大多数关于该主题的博客(如 here and there)感到有点恼火,它们或多或少给人一种 ARC 代码将比 MRC 代码更快的印象(我之前相信这一点)我 Handlebars 放在上面)。而且我真的觉得除了一些微观基准之外情况并非如此。充其量您可以希望与 MRC 持平,而不是更快。我做了一些其他涉及对象操作的简单测试(比如计算文档中的单词)。每次 ARC 都变慢(我认为没有我最初所说的 70% 性能回归那么糟糕)

\begin{讽刺}

事实上,上述文档确实回答了这个问题:

Is ARC slow?

It depends on what you’re measuring, but generally “no.” ...

这显然应该理解为

\begin{戏仿}

Well ... hum ... we cannot say it's slower because this is a new cool techno and we would like you to adopt it. So we answer “no” with double quotes just to avoid a class action. And stop asking stupid questions.

\end{戏仿}

\end{讽刺}

最佳答案

这是我的 ARC vs MRC performance measurements .性能测试项目为available on github所以你可以添加自己的测试。请务必在设备上运行它。模拟器中的结果是有偏差的,并且通常有利于 MRC。

总结:

ARC 和 MRC 通常速度相同。一般来说,ARC 下的代码应该更快,但紧密循环可能更慢,而且速度非常慢。

在低级测试中,由于优化(autorelease 返回,@autoreleasepool),ARC 在速度方面优于 MRC。

有一些代码在 ARC 中插入了额外的保留/释放,这在 MRC 下并不是绝对必要的,只要应用程序是单线程的。此类代码在 ARC 下可能会更慢,尽管它只会在紧密循环中有所不同并且在很大程度上取决于所讨论的代码。

例如,接收对象的方法即使在 MRC 下也应该保留它,因为它可能在方法运行时在多线程应用程序中被释放。事实上,您可以在 MRC 中省略该代码使其速度更快,但本质上更不安全(尽管您很少会遇到这样的问题,如果您希望没有遇到的话,OTOH)。示例:

-(void) someMethod:(id)object
{
[object retain]; // inserted by ARC, good practice under MRC
[object doSomething];
[object doAnotherThing];
[object release]; // inserted by ARC, good practice under MRC
}

因此,我在测试项目中使用的遗传算法使用 ARC 慢了大约 40%。这是一个糟糕的(极端的)例子,因为对于那种算法,由于在 NSMutableArray 和正在创建的 NSNumber 对象上的大量插入/删除操作,您应该通过重写 C 中的关键代码部分来看到更大的性能改进。

完全忽略 ARC 是彻头彻尾的疏忽,因为在某些情况下它可能更慢。如果您发现这些情况对性能至关重要,那么 -fno-objc-arc 该代码或用 C 重写它。

ARC 不应因为性能考虑而被考虑支持或反对。 ARC is a tool that make's a programmer's job a lot easier .由您决定您是否喜欢浪费时间尝试查找泄漏的对象和悬挂指针崩溃,以至于您宁愿坚持使用 MRC。

关于objective-c - 是否有任何关于使用 ARC 的性能影响的具体研究?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12527286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com