我有一个方法需要每秒88次在自己的线程中运行(这是音频单元的回调。)我应该每次调用时都避免创建NSAutoreleasePool吗?
答案 0 :(得分:5)
创建NSAutoReleasePool本身不应该太慢,但如果在“排空”池时有很多对象需要解除分配,那么可能会开始变慢。可能值得分析一下游泳池的排水时间。
答案 1 :(得分:4)
假设您刚从Instruments或Shark回来,并且具体证明自动释放池确实是您应用中的性能问题......
创建自己的自动释放池可以解决两难问题。您在创建大量对象时执行此操作,以便不会立即创建太多对象并输入分页地狱(在Mac上)或获取内存警告和/或终止(iPhone OS)。
但自动释放池也是对象。他们不是免费的。单个自动释放池的费用很小,但是在创建大量对象的循环中,您可能每个X对象创建一个池, 将其耗尽,并为下一个X对象创建另一个。
即使这样,自动释放池可能也不是那么多,因此不会增加太多。你应该在你的乐器或鲨鱼档案中看到这一点:-[NSAutoreleasePool drain]
中花费的大部分时间反过来用在-[NSObject release]
。无论你是否使用自动释放池,这都是你花费的时间。
[编辑:截至2011年12月,现在可以使用@autoreleasepool
语句在没有对象的情况下创建自动释放池。他们可能仍然没有自由(至少没有ARC),但现在他们甚至比以前便宜了。]
因此,在这种情况下,真正的解决方案就是创建更少的对象。这可能意味着:
malloc_good_size
function来舍入大小,以使您不太可能需要重新分配(如果旧的所需大小和新的所需大小都向上舍入到相同的数字,则可以跳过重新分配) 。您也可以考虑只增加缓冲区,而不是缩小缓冲区。答案 2 :(得分:3)
请参阅Mike Ash的Performance Comparisons of Common Operations。当他在10.5中测试时,创建和销毁自动释放池需要0.0003577毫秒。
答案 3 :(得分:2)
如果可以避免,请这样做。如果不能,则无需担心,自动释放池可以很快创建和释放。如果您需要精确的答案,请设置一个简单的测试和测量(在谈论性能时总是一个好主意)。