2012-08-09 88 views
1

我想我的应用程序转换为ARC但是当我做它由5 :(ARC为什么让我的应用程序如此缓慢?

的因素放慢了我的图形视图我有这个代码块遍历所有的点:

  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.1秒的结果,然后我将它转换回来到ARC a一直得到.05秒。 XCode在这里没有给我任何线索,为什么会发生这种情况......但是我的其他代码也在放缓。可能会发生什么?

+0

你真的不应该使用ARC,特别是如果你是初学者。 – 2012-08-09 21:15:28

+2

这只是纯粹的C,所以ARC在这里不应该有所作为。所以如果这段代码实际运行速度较慢,我会非常惊讶。为了更好地进行测试,您应该多次运行上述代码(例如循环1000次),以便您的结果更准确。你上面提到的所有变量都只是本地的,还是一些ivars?而@ H2CO3,这是无稽之谈,ARC是为了让事情变得更简单 - 所以对初学者来说这很好。 – pheelicks 2012-08-09 21:33:21

+16

呃? ARC适合初学者!这就是为什么它是新项目的默认值,以及为什么分析器,编译器和工具链的其余部分都围绕ARC进行了优化。 – bbum 2012-08-09 22:07:01

回答

2

只能有一些选项 - 它必须是下列之一:

1)旧代码使用优化的发言权-Os和新的代码不会(这样,你应该与测试“发布”)而不是“调试”配置。

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

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

那么如何找到一些想法是:

1)仔细检查该方案下配置两个设置,确保其发布(不知道是否ARC运行在调试速度较慢或没有,但调试肯定慢发布)。

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

3)将这整段代码移到你的appDelegateLaunched方法中,然后再做其他任何事情,或者甚至更好地将它放在appDelegate中的“+(void)initialize”方法中(所以它在任何其他代码之前运行)。为你的两个变量硬编码大的balue。

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

+0

这个问题不是其中之一,但至于它可能会是什么,这是一个很好的答案。我仍然不完全确定问题是什么,但它与c数据结构有关,可能与memcopy函数有关。我只是反复使用某些文件,直到我隔离哪个文件,当ARCed时,放慢了应用程序,并且该文件包含一个严重依赖于C数组等的类。 – 2012-08-09 21:56:51

+1

嗯,我只是不明白一堆C代码是如何造成这种情况的。 ARC唯一不同的是管理你的保留/释放/自动释放池。你为什么不把这些时间日志粘在不同的地方,并试图看看发生了什么。如果有什么东西被过早释放,那么重新证实这肯定是一个问题。我已经很高兴使用ARC现在一年多了! – 2012-08-09 22:48:32

7

我会有兴趣看到有问题的文件。无论如何,您可以随时打开ARC的所有内容,但在任何有问题的文件(在性能优化之后)将其关闭。这就是我们在苹果建立了一堆东西的方式。

我们通常在整个项目中打开ARC,然后关闭特定文件。任何关闭它的文件都会得到:

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

另外:强制ARC打开或关闭特定文件是Xcode中目标的构建设置的一部分。您可以使用标志'-fno-objc-arc'来禁用ARC和'-fobj-arc'(iirc)来启用ARC。 – 2012-08-09 22:26:56

相关问题