문제

루프의 항목 수를 수정하는 루프가있는 경우 세트에서 NSEnumerator를 사용하는 것이 코드가 폭발하도록하는 가장 좋은 방법이라는 것을 알고 있지만,NSEnumerator 클래스와 구식 for 루프

도움이 되었습니까?

해결책

Objective-C 2.0에서 새로운 for (... in ...) 구문을 사용하는 것은 일반적으로 컬렉션을 반복하는 가장 빠른 방법입니다. 스택에 버퍼를 유지하고 항목 배치를 가져올 수 있기 때문입니다.

NSEnumerator를 사용하는 것은 반복되는 컬렉션을 자주 복사하기 때문에 일반적으로 가장 느린 방법입니다.변경 불가능한 컬렉션의 경우 이는 저렴할 수 있지만 (-retain와 동일) 변경 가능한 컬렉션의 경우 변경 불가능한 복사본이 생성 될 수 있습니다.

예를 들어 -[NSArray objectAtIndex:]를 사용하여 자체 반복을 수행하면 일반적으로 중간 어딘가에 속합니다. 복사 오버 헤드는 발생하지 않지만 기본 컬렉션에서 개체 배치를 가져 오지 않기 때문입니다.

(PS-NSEnumerator는 Cocoa 클래스이고 새로운 for (... in ...) 구문은 Objective-C에 고유하므로이 질문은 C가 아닌 Objective-C로 태그되어야합니다.)

다른 팁

테스트를 여러 번 실행해도 결과는 거의 같습니다. 각 측정 블록은 10 회 연속 실행됩니다.

내 경우의 결과는 가장 빠른 것에서 가장 느린 것까지입니다.

  1. For..in (testPerformanceExample3) (0.006 초)
  2. While (testPerformanceExample4) (0.026 초)
  3. For (;;) (testPerformanceExample1) (0.027 초)
  4. 열거 형 블록 (testPerformanceExample2) (0.067 초)

    for 및 while 루프는 거의 동일합니다.

    반복 간 비교

    tmp는 0부터 999999까지 1 백만 개의 개체를 포함하는 NSArray입니다. 라코 디스

    전체 코드 :

    ViewController.h 라코 디스

    ViewController.m 라코 디스

    MyTestfile.m 라코 디스

    자세한 내용은 Apples"Xcode를 사용한 테스트 정보 "

매우 비슷합니다.Objective-C 2.0을 사용하면 대부분의 열거 형은 이제 제공 할 수있는 컬렉션의 각 개체에 대한 주소 버퍼를 만드는 NSFastEnumeration로 기본 설정됩니다.고전적인 for 루프에 비해 저장하는 한 단계는 루프 내에서 매번 objectAtIndex:i를 호출 할 필요가 없습니다.열거하는 컬렉션의 내부는 objectAtIndex:i method를 호출하지 않고 빠른 열거를 구현합니다.

버퍼는 열거 할 때 컬렉션을 변경할 수없는 이유의 일부이며, 개체의 주소가 변경되고 빌드 된 버퍼가 더 이상 일치하지 않습니다.

추가적으로 2.0의 형식은 기존 for 루프만큼 멋지게 보입니다. 라코 디스

더 자세히 알아 보려면 다음 문서를 읽어보세요. NSFastEnumeration 프로토콜 참조

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top