2010-03-13 6 views
3

나는 오디오 버퍼 레벨에서 일하고 있는데, 오브젝트의 콜렉션에 의해 생성 된 오디오 신호를 믹싱한다. 44.1khz에서 이러한 객체를 반복하므로 효율이 중요합니다. NSArray와 C 배열의 포인터를 반복 할 때 효율성의 차이가 있습니까? NSMutableArray는 어떻습니까?반복의 효율성 : NSArray 대 포인터의 C 배열?

답변

6

NSArray와 C 배열의 포인터에서 반복 처리의 효율성에 차이가 있습니까?

예. 직접 C 배열을 반복하면 더 빠를 것입니다.

대부분의 앱은이 점에 대해 걱정할 필요가 없으며 성능 향상을 위해 다른 곳을 봐야합니다. 하지만 앱에서이 함수가 초당 44,100 번 실행되면, 마이크로 최적화해야합니다 (가능한 한 적게 수행해야합니다. 즉, 절대적으로 수행해야하는 작업 만 44,100 번 수행해야합니다. 초당 횟수).

NSMutableArray는 어떻습니까?

대. NSArray? 당신이 의지 할 수 있거나 걱정해야 할 차이점이 없습니다.

+0

물론 오디오 프로그램을 사용하고 가능한 한 반복하지 않으려면 코드를 벡터화하지 않으면 다른 성능 문제가 발생할 수 있습니다. – bbum

+0

http://www.savoysoftware.com/blog/my-iphone-is-not-a-mac-pro/C/C++를 사용하여 Cocoa를 최적화하는 방법에 대해 자세히 설명합니다 ... 그의 경우 NSArray/CGRectContainsPoint()에서 전환하는 것이 ~ 4 배 향상되었지만 알고리즘을 변경하는 것은 ~ 200x 이득. –

+0

흥미 롭습니다. 고마워요. – morgancodes

0

NSFastEnumeration 프로토콜은 -countByEnumeratingWithState : objects : count :를 정의합니다. NSArrays, NSMutableArrays 및 이에 준하는 다른 모든 컬렉션 객체의 반복을 위해 C 배열을 사용하여 -objectAtIndex : 각 반복을 피할 수 있습니다. 성능 분석을 사용하여 어느 솔루션이 가장 빠른 솔루션인지 파악하십시오.

+0

사실, 그렇지 않습니다. 빠른 열거는 컬렉션 클래스가 내부적으로 반복을 관리하도록하는 방법이지만 C 배열과 비슷한 방식으로 원격으로는 아무 것도 없습니다. – bbum

+1

프로토콜은 countByEnumeratingWithState : objects : count : 설명과 함께 선언합니다. "보낸 사람이 반복해야하는 개체의 C 배열을 참조로 반환하고 반환 값으로 배열의 개체 수를 참조로 반환합니다." –

+1

오른쪽 -하지만 그것은 똑 바른 C 배열을 열거하는 것과 같은 것도 아니며 컬렉션 클래스의 * 내부 구조 *가 C 배열임을 의미하지도 않습니다. 참조를 복사하고 빠른 열거 메타 데이터를 관리하는 비용을 지불 할 것입니다. -objectEnumerator만큼 중요하지는 않지만, 특히 오디오 처리의 경우에는 여전히 오래된 C 배열보다 느립니다. – bbum