2012-08-09 86 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

相關問題