为什么ARC使我的应用程序如此之慢?

时间:2012-08-09 21:08:19

标签: objective-c ios xcode automatic-ref-counting

我正在尝试将我的应用转换为ARC,但当我这样做时,速度减慢了5倍:(

在我的图表视图中,我有这段代码可以遍历所有点:

            NSLog(@"%f", CACurrentMediaTime());
            for (NSUInteger xIndex = firstXValueOnScreen; xIndex <= lastXValueOnScreen; xIndex++)
            {
                float value = 5; //This used to call a function to get the value but I took out the function call to better demonstrate that this seems to be just a general slowdown...

                if (extremesUninitialized)
                {
                    yMax = value;
                    yMin = value;
                    extremesUninitialized = NO;
                }
                else
                {
                    yMax = MAX(yMax, v,alue);
                    yMin = MIN(yMin, value);
                }
            }
            NSLog(@"%f", CACurrentMediaTime());

在ARC之前,此块在大约0.01秒内执行。然后,我使用ARC转换器,它愉快地将我的代码转换为ARC而没有任何抱怨。在此之后,我在相同的情况下运行相同的代码,得到.05秒的结果!它的速度减慢了5倍...所以我从快照中恢复了我的旧项目,所以不再使用ARC,并且进行了10次测试,并且始终得到了0.01秒的结果。然后我将它转换回ARC并持续获得.05秒。 XCode没有给我任何关于为什么会发生这种情况的线索......但我的其余代码也在减速。会发生什么事?

2 个答案:

答案 0 :(得分:7)

我有兴趣看到有问题的文件。在任何情况下,您都可以随时为所有内容启用ARC,但对于任何有问题的文件(在性能优化之后)将其关闭。这就是我们在Apple上构建一堆东西的方式。

我们通常会为整个项目启用ARC,然后针对特定文件将其关闭。关闭它的任何文件都会得到:

#if __has_feature(objc_arc)
#error This file should not be built with ARC until blah-blah-blah is fixed.
#endif

答案 1 :(得分:2)

只能有一些选项 - 它必须是其中之一:

1)您的旧代码在-Os使用优化器而新代码不使用(因此,您应该使用“Release”进行测试)而不是“Debug”配置。

2)(lastXValueOnScreen - firstXValueOnScreen)的值,即你正在做的范围是不同的(谁知道是什么原因,你必须做一些搜索)

3)有一些后台任务 - 一些线程 - 当你启用ARC时它正在运行,但它通常不存在。

关于如何找到这个的一些想法:

1)仔细检查两者中的Scheme配置设置,确保它的Release(不确定ARC是否在Debug中运行较慢,但Debug肯定比Release慢)。

2)将这两个值添加到for循环上方的日志语句中。

3)在执行任何其他操作之前,将整个代码块移动到appDelegateLaunched方法,或者更好地将其放在appDelegate中的“+(void)initialize”方法中(因此它会在您的任何其他代码之前运行) 。你的两个变量的硬代码大秃头。

我读过ARC的每一篇文章都说得更快;每个Apple工程师都说它更快;我的体验更快。