Iphone 创建NSAutoreleasePool的成本有多高

Iphone 创建NSAutoreleasePool的成本有多高,iphone,cocoa,Iphone,Cocoa,我有一个方法,它需要在自己的线程中每秒运行88次(这是一个音频单元的回调)。我是否应该避免每次调用NSAutoreleasePool时都创建一个NSAutoreleasePool?如果可以避免,就这样做。如果不能,就不必担心,自动释放池会很快创建和释放。如果您需要一个精确的答案,请设置一个简单的测试和度量(这在谈到性能时总是一个好主意)。创建NSAutoReleasePool本身不应该太慢,但是如果在“排空”池时有很多对象需要释放,那么可能会开始变慢。大概值得分析一下泳池排水管需要多长时间。请看

我有一个方法,它需要在自己的线程中每秒运行88次(这是一个音频单元的回调)。我是否应该避免每次调用NSAutoreleasePool时都创建一个NSAutoreleasePool?

如果可以避免,就这样做。如果不能,就不必担心,自动释放池会很快创建和释放。如果您需要一个精确的答案,请设置一个简单的测试和度量(这在谈到性能时总是一个好主意)。

创建NSAutoReleasePool本身不应该太慢,但是如果在“排空”池时有很多对象需要释放,那么可能会开始变慢。大概值得分析一下泳池排水管需要多长时间。

请看Mike Ash的。当他在10.5中进行测试时,创建和销毁自动释放池需要0.0003577毫秒。

假设您刚从Instruments或Shark回来,有具体证据表明自动释放池确实是应用程序中的性能问题

创建自己的自动释放池是一个两难问题的答案。您在创建大量对象时会这样做,以避免一次创建太多对象,或者进入paging hell(在Mac上)或获得内存警告和/或终止(iPhone OS)

但自动释放池也是对象。他们不是免费的。单个自动释放池的开销很小,但在创建大量对象的循环中,可能每X个对象创建一个池, 排空它,并为下一个X对象创建另一个

即便如此,自动释放池可能也没有那么多,因此也不会增加多少。您应该在仪器或Shark配置文件中看到这一点:花在
-[NSAutoreleasePool drain]
上的大部分时间反过来花在
-[NSObject release]
上。无论是否使用自动释放池,您都将花费这些时间

[EDIT:截至2011年12月,现在可以使用
@autoreleasepool
语句在没有对象的情况下创建autorelease池。它们可能仍然不是免费的(至少没有ARC),但现在比以前更便宜了。]

因此,在这种情况下,真正的解决方案只是创建更少的对象。这意味着:

  • 尽可能使用和重用缓冲区,在需要更改大小时使用以前使用的缓冲区。您可能希望使用将大小四舍五入,以减少需要重新分配的可能性(如果旧的所需大小和新的所需大小都四舍五入到相同的数字,则可以跳过重新分配)。你也可以考虑只增加缓冲区,不要缩小它。
  • 使用和重用可变对象。例如,如果您构建一个字符串,然后将其写入文档,而不是将其释放并创建一个新的字符串,则删除其全部内容,或者用“新”字符串的第一部分替换整个旧内容
  • 调整X的值(池处置阈值)。更高的X意味着更多的瞬时内存消耗,但创建和丢弃的池更少。X越低意味着池越多,但分页或得到内存警告的风险越小。这不太可能有太大的区别,除非你把X调得太高,或者把它调得太高

感谢您今天第二次提醒我们,实验是了解性能的最佳方式zoul:)更相关的可能是他的iPhone基准测试(考虑到问题的标签):相同的操作需要0.0173毫秒。无论如何,在这种情况下,通常需要通过实验测试来平衡性能。我刚刚从shark回来。[NSAutoReleasPool release]占用了我0.2%的cpu,看起来像。我负担得起,我要把它留在那里。谢谢彼得。事实证明,在我的例子中,-[NSAutoreleasePool drain]对性能的影响是可以忽略的,但这是一个很好的信息,可供将来参考。