programing

열거형 ObjectsUsingBlock 대 .

oldcodes 2023. 5. 4. 20:29
반응형

열거형 ObjectsUsingBlock 대 .

명백한 차이점 외에도:

  • 사용하다enumerateObjectsUsingBlock와 할 때
  • 로컬 변수를 수정해야 할 때 사용하지 마십시오(제가 잘못했습니다, bbum의 답변 참조).

아이즈enumerateObjectsUsingBlock일반적으로 더 좋든 나쁘든 간에for (id obj in myArray)효과가 있을까요?장점/단점은 무엇입니까(예: 성능이 높거나 낮습니까)?

궁극적으로, 사용할 패턴을 사용하고 컨텍스트에서 더 자연스럽게 제공됩니다.

하는 동안에for(... in ...)간략합니다.enumerateObjectsUsingBlock:에는 흥미롭거나 그렇지 않은 여러 기능이 있습니다.

  • enumerateObjectsUsingBlock: 열거형 enumeration)보다 빠르거나 입니다.for(... in ...)를 사용합니다.NSFastEnumeration열거형을 구현하기 위한 지원).빠른 열거는 빠른 열거를 위해 내부 표현에서 표현으로 변환해야 합니다.그 안에 오버헤드가 있습니다.블록 기반 열거를 사용하면 컬렉션 클래스에서 네이티브 저장소 형식의 가장 빠른 통과 속도로 컨텐츠를 열거할 수 있습니다.배열에는 관련이 없을 수 있지만 사전에는 큰 차이가 될 수 있습니다.

  • "할 때 안 함- 을 "EnumerateObjectsUsingBlock" - true"로할 수 로컬을 다음과 같이 선언할 수 있습니다.__block블록에서 쓸 수 있습니다.

  • enumerateObjectsWithOptions:usingBlock:동시 열거나 역 열거를 지원합니다.

  • 사전에서는 블록 기반 열거가 키와 값을 동시에 검색하는 유일한 방법입니다.

는 개인적으로 개적으저는을 합니다.enumerateObjectsUsingBlock:보다더자보다 더 for (... in ...)하지만 - 다시 - 개인적인 선택.

빠른 a 열한거위해단, 즉열빠른거다를를사, a 합니용히순단간즉▁a), a ▁fast니다사▁for용▁usingifor…in…loop은 더 옵션입니다. loop).블록 방식이 약간 더 빠를 수도 있지만 대부분의 경우에는 크게 문제가 되지 않습니다. CPU에 바인딩된 프로그램이 거의 없고 내부 계산이 아닌 루프 자체가 병목 현상이 되는 경우도 드물기 때문입니다.

간단한 루프는 또한 더 명확하게 읽힙니다.두 버전의 상용어구는 다음과 같습니다.

for (id x in y){
}

[y enumerateObjectsUsingBlock:^(id x, NSUInteger index, BOOL *stop){
}];

인덱스를 추적하기 위해 변수를 추가하더라도 단순 루프가 더 읽기 쉽습니다.

그래서 당신이 사용해야 할 때enumerateObjectsUsingBlock:나중에 또는 여러 장소에서 실행할 블록을 저장하는 경우.루프 본체의 과도한 교체보다는 블록을 1등급 기능으로 실제로 사용할 때 좋습니다.

이 질문은 오래된 것이지만, 상황은 변하지 않았고, 받아들여진 답은 틀렸습니다.

enumerateObjectsUsingBlock는 API를 .for-in하지만 완전히 다른 사용 사례:

  • 임의의 비로컬 논리를 적용할 수 있습니다. 즉, 블록이 어레이에서 사용하기 위해 무엇을 하는지 알 필요가 없습니다.
  • 또는 계산을 동시 )withOptions:매개 변수)

빠열 을 for-in여전히 컬렉션을 열거하는 관용적인 방법입니다.

빠른 열거형은 코드의 간결성, 가독성 및 비정상적으로 빠른 추가 최적화의 이점을 제공합니다.오래된 C for 루프보다 빠릅니다!

간단한 테스트를 통해 iOS 7에서 2014년에 다음과 같은 결과가 나왔습니다.enumerateObjectsUsingBlock포인(for-in)보다 일관되게 700% 느립니다(100개 항목 배열의 1mm 반복 기준).

여기서 성능이 정말 실질적인 문제입니까?

확실히 아닙니다, 드문 예외를 제외하고요.

요점은 사용함으로써 얻을 수 있는 이점이 거의 없다는 것을 입증하는 것입니다.enumerateObjectsUsingBlock:1파운드가 for-in를 더 쉽게 ...코드를 더 읽기 쉽게 만들지는 못합니다.아니면 더 빨리... 다른 오해(또 다른 일반적인 오해).

선택은 개인의 취향에 따라 결정됩니다.저에게는 관용적이고 읽을 수 있는 옵션이 이깁니다.에는 " Enumeration"을 사용한 "Fast 입니다.for-in.

벤치마크:

NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i < 100; i++) {
    arr[i] = [NSString stringWithFormat:@"%d", i];
}
int i;
__block NSUInteger length;

i = 1000 * 1000;
uint64_t a1 = mach_absolute_time();
while (--i > 0) {
    for (NSString *s in arr) {
        length = s.length;
    }
}
NSLog(@"For-in %llu", mach_absolute_time()-a1);

i = 1000 * 1000;
uint64_t b1 = mach_absolute_time();
while (--i > 0) {
    [arr enumerateObjectsUsingBlock:^(NSString *s, NSUInteger idx, BOOL *stop) {
        length = s.length;
    }];
}
NSLog(@"Enum %llu", mach_absolute_time()-b1);

결과:

2014-06-11 14:37:47.717 Test[57483:60b] For-in 1087754062
2014-06-11 14:37:55.492 Test[57483:60b] Enum   7775447746

성능에 대한 질문에 답하기 위해, 는 성능 테스트 프로젝트를 사용하여 몇 가지 테스트를 했습니다.저는 배열에 있는 모든 객체에 메시지를 보내는 세 가지 옵션 중 어떤 것이 가장 빠른지 알고 싶었습니다.

옵션은 다음과 같습니다.

객체 선택기 수행

[arr makeObjectsPerformSelector:@selector(_stubMethod)];

빠른 열거 및 정기적인 메시지 전송

for (id item in arr)
{
    [item _stubMethod];
}

열거ObjectBlock & 일반 메시지 보내기 사용

[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
 {
     [obj _stubMethod];
 }];

makeObjectsPerformSelector는 지금까지 가장 느렸습니다.빠른 열거보다 두 배나 오래 걸렸습니다.그리고 enumerObjectsUsingBlock이 가장 빨랐고, 빠른 반복보다 약 15-20% 더 빨랐습니다.

따라서 가능한 최상의 성능이 매우 중요한 경우에는 블록을 사용하여 개체를 열거합니다.그러나 경우에 따라 컬렉션을 열거하는 데 걸리는 시간이 각 개체가 실행할 코드를 실행하는 데 걸리는 시간에 따라 달라집니다.

중첩된 루프를 끊으려는 경우 외부 루프로 블록 사용을 사용하여 개체 열거를 사용하는 것이 매우 유용합니다.

예.

[array1 enumerateObjectsUsingBlock:^(id obj1, NSUInteger idx, BOOL * _Nonnull stop) {
  for(id obj2 in array2) {
    for(id obj3 in array3) {
      if(condition) {
        // break ALL the loops!
        *stop = YES;
        return;
      }
    }
  }
}];

다른 방법은 go to 문을 사용하는 것입니다.

성능에 대한 포괄적인 비교를 시작한 @bbum과 @Chuck에게 감사드립니다.사소한 일이라 다행입니다.저는 다음과 같이 생각합니다.

  • for (... in ...)나의 기본적인 방법으로.나에게 더 직관적인 것은, 어떤 실제 선호보다 프로그래밍 이력이 더 많다는 것입니다 - 교차 언어 재사용, IDE 자동 완성으로 인한 대부분의 데이터 구조에 대한 타이핑 감소 :P.

  • enumerateObject...개체 및 인덱스에 대한 액세스가 필요한 경우그리고 비배열 또는 사전 구조에 액세스할 때(개인 선호)

  • for (int i=idx; i<count; i++), 해야 할 때 어이이경 0아닌인덱에서스시작경하우는야해레의우▁for경우▁i,하.

언급URL : https://stackoverflow.com/questions/4486622/when-to-use-enumerateobjectsusingblock-vs-for

반응형