2010-03-24 7 views
4

초당 88 번씩 자체 스레드에서 실행해야하는 메서드가 있습니다 (오디오 장치의 콜백입니다.) 호출 할 때마다 NSAutoreleasePool을 생성하지 않아야합니까?NSAutoreleasePool을 만드는 것이 얼마나 비쌉니까?

+1

이제 막 상어에서 돌아 왔습니다. [NSAutoReleasPool release]가 내 CPU의 0.2 %를 사용하고 있습니다. 나는 그것을 가질 여유가있다, 나는 그것을 거기에두고 갈 것이다. – morgancodes

답변

2

피할 수 있으면 그렇게하십시오. 당신이 할 수 없다면, 그것에 대해 걱정할 필요가 없습니다, 자동 풀 풀이 생성되고 아주 빨리 릴리즈됩니다. 정확한 답변이 필요한 경우 간단한 테스트와 측정을 설정하십시오 (실적에 대해 말할 때 항상 좋은 아이디어입니다).

+0

오늘 실험이 성능 zoul에 대해 배우는 가장 좋은 방법이라는 두 번째 알림을 보내 주셔서 감사합니다. – morgancodes

5

NSAutoReleasePool 자체를 생성하는 것이 너무 느려서는 안되지만, 풀을 배수 할 때 dealloc으로 처리 할 객체가 많은 경우 느리게 시작될 수 있습니다. 풀 풀이 걸리는 시간을 프로파일 링 할 가치가 있습니다.

3

마이크 애쉬의 Performance Comparisons of Common Operations을 참조하십시오. 그가 10.5에서 테스트했을 때 autorelease 풀을 만들고 파괴하는 데 0.0003577 밀리 초가 걸렸습니다.

+1

관련성 높은 iPhone 벤치 마크 (관련 질문에 태그 추가) : http://www.mikeash.com/pyblog/performance -comparisons-of-common-operations-iphone-edition.html 같은 작업에는 0.0173ms가 소요됩니다. 어떤 경우이든 성능 균형을 맞추기위한 실험적 테스트가 일반적으로 필요합니다. –

4

자신의 오토 릴리즈 풀을 생성

... 그냥 수영장이 정말 응용 프로그램의 성능 우려 autorelease를 구체적인 증거를 계기 또는 상어에서 돌아 왔어요 가정 딜레마에 대한 답변입니다. 한 번에 너무 많이 생성하지 말고 페이징 지옥 (Mac)을 입력하거나 메모리 경고 및/또는 종료 (iPhone OS)를 받으려면 많은 객체를 만들 때 작업하십시오.

그러나 autorelease 풀은 객체이기도합니다. 그들은 자유롭지 않다. 하나의 자동 풀 풀의 비용은 매우 적지 만, 많은 객체를 생성하는 루프에서 X 객체마다 하나의 풀을 생성하고, 은 배수 처리하고 다음 X 객체는 다른 풀을 생성합니다.

그럼에도 불구하고 자동 복구 풀은 그다지 많지 않으므로 많이 추가되지는 않습니다. 인스 트루먼 트 또는 상어의 프로필에서 이것을보아야합니다 : 대부분 -[NSAutoreleasePool drain]에서 보낸 시간은 -[NSObject release]입니다. 이제 autorelease 풀을 사용하든 사용하지 않든간에 지출 할 시간입니다.

[편집 : 2011 년 12 월 현재 @autoreleasepool 문과 함께 개체가없는 자동 풀 풀을 만들 수 있습니다. 그들은 아마도 여전히 무료는 아닙니다 (최소한 ARC가없는 경우), 지금은 이전보다 훨씬 저렴합니다.]

그래서 이러한 경우의 진정한 해결책은 단순히 적은 수의 개체를 만드는 것입니다. 이 의미 :

  • 을 가능한 한 reallocating 이전에 사용 된 버퍼 크기 때 필요한 변경을 이용하여 버퍼의 재사용. 다시 할당해야 할 가능성을 줄이기 위해 the malloc_good_size function을 사용하여 크기를 조정할 수 있습니다. 이전에 필요한 크기와 필요한 새 크기가 둘 다 같은 수로 반올림되면 다시 할당하지 않아도됩니다. 버퍼를 늘리지 않고 축소하는 것만을 고려할 수도 있습니다.
  • 변경 가능한 개체 사용 및 재사용. 예를 들어, 문자열을 작성한 다음 문서에 쓰거나 새 문자열을 작성하는 대신 전체 내용을 삭제하거나 "old"전체 내용을 "new"문자열의 첫 번째 부분으로 바꾸십시오.
  • X (풀 처리 임계 값)의 값 조정. X가 클수록 순간 메모리가 더 많이 소모되지만 더 적은 수의 풀이 만들어져 폐기됩니다. 더 낮은 X는 더 많은 풀을 의미하지만 페이징 또는 메모리 경고를받을 위험이 적습니다. X를 너무 멀리 올리거나 너무 높게 설정하는 경우를 제외하고는 다른 점이별로 없습니다.
+0

피터에게 감사드립니다. 내 경우에는 성능이 떨어졌습니다. [NSAutoreleasePool drain]은 무시할 수없는 것으로 밝혀졌습니다. 그러나 이것은 나중에 참조할만한 좋은 정보입니다. – morgancodes

관련 문제