有没有关于使用 ARC 对性能影响的具体研究?

2023-12-20

我找不到关于现实项目中 ARC 性能影响的客观研究。官方文档 http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html says

编译器有效地消除了许多无关的保留/释放调用,并且在总体上加速 Objective-C 运行时方面投入了大量精力。特别是,当方法的调用者是 ARC 代码时,常见的“返回保留/自动释放对象”模式要快得多,并且实际上不会将对象放入自动释放池中。

科技迷们将其转述/变形为“ARC 更快”。

我所确定的就是我所测量的。我们最近将 iOS 项目迁移到 ARC,我在代码的某些 CPU 密集区域(生产代码,使用-Os当然是旗帜)。

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

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

幸运的是,仪器能够向我展示 ARC 引入的最昂贵的保留/释放,并且我能够使用 __unsafe_unretained 停用它们。这稍微减轻了性能下降的影响。

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

Thanks.

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

我只是对绝大多数关于这个主题的博客有点恼火(比如here http://blog.mugunthkumar.com/articles/migrating-your-code-to-objective-c-arc/ 在那里 http://maniacdev.com/ios-5-sdk-tutorial-and-guide/arc-automatic-reference-counting/)这或多或少给人一种印象,即 ARC 代码将比 MRC 代码更快(在我动手之前我就相信这一点)。我确实有这样的感觉:除了一些微观基准测试之外,情况并非如此。您最多只能希望与 MRC 持平,而不是更快。我做了一些其他涉及对象操作的简单测试(例如计算文档中的单词数)。每次 ARC 都会变慢(我认为没有我最初所说的 70% 性能回归那么糟糕)

\开始{讽刺}

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

ARC 慢吗?

这取决于您测量的内容,但通常是“否”。 ...

显然应该理解为

\开始{模仿}

嗯...嗯...我们不能说它更慢,因为这是一项新的很酷的技术,我们希望您采用它。因此,我们用双引号回答“不”,只是为了避免集体诉讼。别再问愚蠢的问题了。

\end{戏仿}

\结束{讽刺}


这是我的ARC 与 MRC 性能测量 http://www.learn-cocos2d.com/2013/03/confirmed-arc-slow/。性能测试项目为可以在 github 上找到 https://github.com/LearnCocos2D/LearnCocos2D/tree/master/Cocos2D-ARC-Performance-Test这样您就可以添加自己的测试。只要确保在设备上运行它即可。模拟器中的结果存在偏差,并且通常有利于 MRC。

总结一下:

ARC和MRC一般速度相同。一般来说,代码在 ARC 下应该会更快,但紧密循环可能会更慢,而且速度明显更慢。

在低级测试中,由于优化(自动释放返回,@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 是彻头彻尾的疏忽,因为它can慢一点在某些情况下。如果您发现这些情况对性能至关重要,那么-fno-objc-arc该代码或用 C 重写它。

不应因为性能考虑而考虑赞成或反对ARC。ARC 是一个让程序员的工作变得更加轻松的工具 https://stackoverflow.com/a/8760820/201863。由您来决定您是否喜欢浪费时间尝试查找泄漏的对象和悬空指针崩溃,以至于您宁愿坚持使用 MRC。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有关于使用 ARC 对性能影响的具体研究? 的相关文章

  • 频繁绘制 CGPath 时的性能

    我正在开发一个将数据可视化为折线图的 iOS 应用程序 该图被绘制为CGPath在全屏自定义中UIView最多包含 320 个数据点 数据经常更新 图表需要相应地重新绘制 刷新率为 10 秒就很好了 到目前为止很容易 然而 我的方法似乎需要
  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • iPhone 和加密库

    我想我必须在我的 iPhone 应用程序中使用加密库 我想问你有关苹果公司实施的加密货币出口政策的影响 我需要做一些额外的事情吗 例如填写表格等 1 如果我使用 MD5 进行哈希处理 2 如果我使用对称加密 Thanks EDIT 2009
  • 无法在 Windows 上使用 Gnustep 编译 Objective C

    嗨 我是初学者 学习目标c 我发现错误 hello m 1 34 Foundation Foundation h 没有这样的文件或目录 我开始知道我需要制作一个 make 文件 我可以知道如何制作 make 文件吗 无需创建 makefil
  • Javascript 定时通知 - setTimeout、setInterval

    我正在创建一个网络应用程序 允许用户管理日历 CRUD 事件 任务 提醒等 我正在尝试实现一个功能 他们将在事件 任务前 x 分钟收到弹出提醒 根据我的理解 使用 javascript 确实只有一种方法可以做到这一点 登录时 检查数据库中是
  • getItem 与 getItemAtPosition

    有两种方法可以获取列表视图中的选定项目 list getAdapter getItem position list getItemAtPosition position 我的问题是 哪一种是首选的做法 我见过人们同时使用这两种方法 您可以使
  • 获取对 iOS 应用程序中最顶层视图/窗口的引用

    我正在创建一个可重用的框架 用于在 iOS 应用程序中显示通知 我希望将通知视图添加到应用程序中其他所有内容的顶部 有点像 UIAlertView 当我初始化监听 NSNotification 事件并添加视图作为响应的管理器时 我需要获取对
  • 如何在 Xcode 4 中在 .h 和 .m 之间切换

    刚刚安装的 Xcode 4 到目前为止一切顺利 除了 Apple 更改了所有键盘快捷键 有人知道如何在 h 和 m 之间切换吗 苹果改变了各种快捷键 但要在标头和实现之间切换 新的快捷键是 You can change it back to
  • Swift 使用哪种通用排序算法?它在排序数据上表现不佳

    我一直在挑选和探索 Swift 标准库sort 其函数为Array类型 令我惊讶的是 我注意到它在已经排序的数据上表现不佳 对数组进行排序Int打乱顺序似乎比对已经排序的同一个数组进行排序快 5 倍 对已打乱顺序的对象数组进行排序比对已按排
  • GMSMapView 中的倒多边形

    我必须在我的 iPhone 项目中使用 Google 地图 并且我正在使用 GMSPolygon 来绘制多边形 但是如何填充地图上除多边形内部之外的所有位置 就像下图一样 谢谢 我玩过你的问题 主要思想是用多边形填充整个地球 然后为您的特定
  • iOS 10 的错误? NSDate 日本地区时间描述和 24 小时休息

    这似乎是 iOS 10 的一个错误 在 iOS 8 和 9 中都可以 NSDate date description 的小时描述是错误的 它附加了 24 小时描述和 12 小时描述 我没有使用 NSDateFormatter 只是默认设置
  • Javascript 播放声音性能重吗?

    我正在用 Javascript 制作一个简单的游戏 当一个物体与墙壁碰撞时 它会发出 砰 的声音 声音的响度取决于物体的速度 速度越高 gt 声音越大 播放功能 playSound function id vol ID of the sou
  • 适用于 Objective-C / iPhone 的良好 HTTP 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 UPDATE 这个问题显然已经过时了 参见日期 我建议只使用现代 iOS7 功能 例如 NSURLSession 我想 这个问题是为了历史
  • 我可以知道 requireGestureRecognizerToFail 到底会做什么吗?

    谁能告诉我下面的代码行到底会做什么 我已经提到过Apples https developer apple com library ios documentation uikit reference UIGestureRecognizer C
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v
  • 使用 Storyboard 时获取 NSManagedObjectContext

    目标是获取当前的 NSManagedObjectContext 以便使用 Core Data 在 iOS 4 3 中 我将 UINavigationController 的委托设置为 AppDelegate 如下所示 在 AppDelega
  • 将 CALayer 旋转 90 度?

    如何旋转CALayer90度 我需要旋转所有内容 包括子图层和坐标系 Obj C theLayer transform CATransform3DMakeRotation 90 0 180 0 M PI 0 0 0 0 1 0 Swift
  • 我应该在哪个方法中设置 UITextField 的委托?

    在 viewDidLoad 或 init 方法中设置 UITextField 的委托是一个好习惯吗 我尝试在 init 方法中将委托设置为 self 但它没有调用相应的委托方法 当我将代码移动到 viewDidLoad 中时 它注册为将 s
  • 如何通过辅助功能 API 获取当前所选文本的全局屏幕坐标。

    我需要帮助来了解字典应用程序如何在任何应用程序上按 CMD CTRL D 时显示所选文本的以下弹出对话框 我想实施 我的可可应用程序具有相同的功能 我的应用程序将在后台运行 并显示有关所选文本的一些热键的建议 我已经实现了热键捕获 我只需要
  • 如何清除 APC 缓存而不使 Apache 崩溃?

    如果 APC 存储大量条目 清除它们会导致 httpd 崩溃 如果 apc clear cache user 花费的时间超过 phps max execution time 调用 apc clear cache 的脚本 将在之前被 php

随机推荐