2012-08-09 2 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 번 테스트를했고 일관되게 결과는 .01 초였습니다. 그런 다음 다시 변환했습니다. ARC에 지속적으로 0.05 초 남았습니다. Xcode는 왜 이런 일이 일어나는지에 대한 단서를 제공하지 않습니다 ... 그러나 나머지 코드도 느려지고 있습니다. 무슨 일이 벌어 질 수 있니?

+0

특히 초보자 인 경우 ARC를 사용하면 안됩니다. –

+2

이것은 순수한 C 일 뿐이므로 ARC가 여기에서 차이를 만들어서는 안됩니다. 따라서이 코드가 실제로 느리게 실행되면 매우 놀랍습니다. 더 나은 테스트를 위해 위 코드를 두 번 이상 (예 : 루프에서 1000 번) 실행해야 결과가 더 정확합니다. 또한 위에서 언급 한 모든 변수가 로컬이거나, 일부 ivars입니까? 그리고 엉뚱한 @ H2CO3은 ARC가 일을 더 쉽게하기위한 것이므로 초보자들에게는 적합합니다. – pheelicks

+16

Wut? ARC는 초보자에게 적합합니다! 이것이 새로운 프로젝트의 기본이며 왜 분석기, 컴파일러 및 나머지 툴 체인이 ARC를 중심으로 최적화되었는지에 대한 이유입니다. – bbum

답변

2

은 옵션의 소수가있을 수 있습니다 - 그것은 다음 중 하나 여야합니다

1) 기존의 코드가 -Os 말에 최적화를 사용하고 새로운 코드 (그래서, 당신이 테스트를해야하지 않습니다 "Release") "Debug"구성이 아닙니다.

2) lastXValueOnScreen (값 - firstXValueOnScreen)는, 당신이하고있는 범위, 즉 누가 어떤 이유를 알고를 들어, 당신은 몇 가지 검색)

3) 몇 가지 배경 작업이이 작업을 수행해야합니다 (다른 - 일부 스레드 - ARC를 사용할 때 amuck을 실행하지만 정상적으로는 실행되지 않습니다.

그래서 찾는 방법에 대한 몇 가지 아이디어이 :

1)을 두 번, ARC가 느린 디버그의 여부를 실행하는 경우 확실하지만, 디버그 확실히보다 느린 없습니다 (확인 출시을 모두 설정 계획의 구성을 확인 해제).

2) for 루프 위의 로그 문에이 두 값을 추가하십시오.

3) 다른 작업을 수행하기 전에이 코드 전체를 appDelegateLaunched 메소드로 이동하거나 appDelegate의 "+ (void) 초기화"메소드에 넣는 것이 더 좋습니다 (다른 코드보다 먼저 실행되기 때문에).). 귀하의 두 변수에 대한 하드 코드 큰 balances.

ARC에서 읽은 모든 독본은 더 빠릅니다. 모든 Apple 엔지니어가 더 빨리 말합니다. 내 경험이 더 빠릅니다.

+0

문제는 이것들 중 하나가 아니었지만 지금까지 가능한 일이 될 수있는 한 큰 대답이었습니다. 나는 여전히 문제가 무엇인지 완전히 모르겠다.하지만 아마도 memcopy 함수와 함께 c 데이터 구조와 관련이있다. 나는 ARC가 특정 파일을 ARCing 할 때까지 어떤 파일을 앞뒤로왔다 갔다 할 때 ARCed가 응용 프로그램을 느리게 만들었고 그 파일에는 C 배열 등에 많이 의존하는 클래스가 포함되어있다. –

+1

글쎄, 난 그냥 C 코드 잔뜩이 발생할 수있는 이해할 수 없다. ARC가 수행하는 유일한 작업은 보존/릴리스/자동 복구 풀 관리입니다. 타이밍 로그를 여러 위치에 붙여 놓고 진행 상황을 확인해 보는 것이 어떻습니까? 어떤 것이 조기에 풀려나 간다면 문제가 될 수 있음을 재확인합니다. 나는 ARC를 사용하여 1 년 넘게 행복 해졌다. –

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 
+3

추가 : 특정 파일에 대한 ARC 강제 설정 또는 해제는 Xcode에서 대상의 빌드 설정 중 일부입니다. '-fno-objc-arc' 플래그를 사용하여 ARC를 비활성화하고'-fobj-arc' (iirc)를 사용하여 ARC를 활성화 할 수 있습니다. –

관련 문제