1

我正在尝试将我的应用程序转换为 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,没有任何抱怨。在此之后,我在相同的情况下运行相同的代码并得到 0.05 秒的结果!它减慢了 5 的倍数......所以我从快照中恢复了我的旧项目,所以没有更多的 ARC,并且进行了 10 次测试,并且始终得到 0.01 秒的结果。然后我将其转换回 ARC 并始终获得 0.05 秒。XCode 在这里没有给我任何关于为什么会发生这种情况的线索......但是我的其余代码也在变慢。会发生什么?

4

2 回答 2

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
于 2012-08-09T22:09:45.270 回答
2

只能有几个选项 - 它必须是以下之一:

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

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

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

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

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

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

3) 在您执行任何其他操作之前,将整段代码移至您的 appDelegateLaunched 方法,或者甚至更好地将其放入 appDelegate 中的“+(void)initialize”方法中(因此它在您的任何其他代码之前运行)。为您的两个变量硬编码大值。

我在 ARC 上读过的每一个文档都说它更快;每个 Apple 工程师都说它更快;我的经验是它更快。

于 2012-08-09T21:32:46.153 回答