创建NSAutoreleasePool有多贵

时间:2010-03-24 00:08:30

标签: iphone cocoa

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

4 个答案:

答案 0 :(得分:5)

创建NSAutoReleasePool本身不应该太慢,但如果在“排空”池时有很多对象需要解除分配,那么可能会开始变慢。可能值得分析一下游泳池的排水时间。

答案 1 :(得分:4)

假设您刚从Instruments或Shark回来,并且具体证明自动释放池确实是您应用中的性能问题......

创建自己的自动释放池可以解决两难问题。您在创建大量对象时执行此操作,以便不会立即创建太多对象并输入分页地狱(在Mac上)或获取内存警告和/或终止(iPhone OS)。

但自动释放池也是对象。他们不是免费的。单个自动释放池的费用很小,但是在创建大量对象的循环中,您可能每个X对象创建一个池, 将其耗尽,并为下一个X对象创建另一个。

即使这样,自动释放池可能也不是那么多,因此不会增加太多。你应该在你的乐器或鲨鱼档案中看到这一点:-[NSAutoreleasePool drain]中花费的大部分时间反过来用在-[NSObject release]。无论你是否使用自动释放池,这都是你花费的时间。

[编辑:截至2011年12月,现在可以使用@autoreleasepool语句在没有对象的情况下创建自动释放池。他们可能仍然没有自由(至少没有ARC),但现在他们甚至比以前便宜了。]

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

  • 尽可能使用和重用缓冲区,reallocating当需要的大小发生变化时,先前使用的缓冲区。您可能希望使用the malloc_good_size function来舍入大小,以使您不太可能需要重新分配(如果旧的所需大小和新的所需大小都向上舍入到相同的数字,则可以跳过重新分配) 。您也可以考虑只增加缓冲区,而不是缩小缓冲区。
  • 使用和重用可变对象。例如,如果您构建一个字符串然后将其写入文档,而不是释放它并创建一个新文档,则删除其全部内容,或用“new”字符串的第一部分替换整个旧内容。
  • 调整X的值(您的池处置阈值)。较高的X意味着更多的瞬时内存消耗,但创建和丢弃的池更少。较低的X意味着更多的池,但更少的分页或获取内存警告的风险。这种情况不太可能产生太大的影响,除非你把X抬得太远,或者把它从太高的地方降低。

答案 2 :(得分:3)

请参阅Mike Ash的Performance Comparisons of Common Operations。当他在10.5中测试时,创建和销毁自动释放池需要0.0003577毫秒。

答案 3 :(得分:2)

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