2014-02-18 4 views
0

많은 데이터를 NSDictionary에서 NSManagedObjects (3k-10k 개체)으로 처리해야합니다. 동기 처리와목표 C 및 스레딩

은 3K는 약 60 초 취

for (NSString *key in myDictionary) { 
    //process data 
} 

I는 GCD를 사용하여 각 키에 대해 새로운 스레드를 만들고이 약 20 초 정도가 스레드의 무리 사용했을

for (NSString *key in myDictionary) { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     //process data 
    } 
}  

012 :

그러면 I은 약 30 초 만 사용했다 2 스레드 블록의 실행을 추가로 NSBLockOperation 각 키를 사용하여 시도 NSOperationQueue

이렇게하면 완료 블록을 가질 수 있다는 이점이 있습니다.

속도면에서 볼 때 키당 스레드가 가장 빠른 것 같습니다.

모든 시간은 시뮬레이터가 아닌 기기에서 수행됩니다.

내가 NSOperation 대 GCD를 고려했을 때, 그들은 NSOperation 인 더 높은 수준의 API를 사용할 것을 제안했지만, GCD가 더 나은 성능을 제공합니다.

완료 블록 이외의 NSOperationQueueNSBlockOperation을 사용하면 어떤 장점이 있습니까? 아니면 큐와 블럭이 본질적으로 GCD보다 나은 무언가를 놓치고 있습니까?

+0

관련 : http://stackoverflow.com/questions/18632271/what-is-the- 차이점 - nsinvocationoperation - and - nsblockoperation –

+3

Objective-C에서 스레딩을 수행하는 방법은 약 6 가지입니다. 다른 것들보다 하나를 선택하는 특별한 이유가 있지 않는 한, 당신이 가장 잘 이해하고 가장 편한 기술을 사용하십시오.스레딩은 그만큼 혼란스럽고 복잡한 상황에서 익숙하지 않은 인터페이스를 사용하면 혼란이 가중됩니다. –

답변

2

또는 큐와 블록을 본질적으로 GCD보다 좋게 만드는 것이 누락 되었습니까?

GCD를 사용하여 작업이 누락되었습니다. 앞서 보았 듯이 GCD보다 높은 수준의 API를 사용하는 것이 좋지만 결국에는 GCD를 사용하는 것과 본질적으로 다른 점이 없습니다.

+0

왜 GCD가 30+ (스레드 ID가 30 대가 아닌데 100 %가 30+ 스레드가 있는지)를 사용하는 동안 연산이 2 개의 스레드 만 사용했는지 궁금합니다. – Padin215

+1

하나 이상의 스레드가 사용되지 않는다고 생각합니다. 당신이 얻는 트레드 #가 "무작위"가되도록 스레드 풀이 있습니다. GCD는 해당 풀에서 다른 스레드에 블록을 발송하지만 AFAIK는 다른 스레드에서 한 블록을 실행하지 않습니다. (당신의 디스패치는 for 루프 밖에있다.) 모든 쓰레드는 자체적 인 스택을 가지고 있으므로 한 쓰레드에서 다른 쓰레드로 이동하는 것은 상당히 비싸다. –

+0

그러면 GCD가 10 초 더 빠름을 어떻게 설명하겠습니까? [NSThread currentThread]와 GCD를 기록하면, 작업이 2 개의 스레드 ID 만 사용하는 동안 많은 스레드 ID를 볼 수 있습니까? – Padin215

1

위에서 언급 한 것처럼 조작 및 조작 대기열은 GCD 위에 구축됩니다. 하지만 몇 가지 차이점이 있습니다.

  • 작업 대기열의 너비가있을 수 있습니다. GCD는 직렬 또는 동시 대기열 만 알고 있습니다.
  • 조작 대기열은 종속성을 처리 할 수 ​​있습니다.

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
        for (NSString *key in myDictionary) { 
         //process data 
        } 
    } 
    
    : 내 댓글에서 언급 한 바와 같이
  • 운영은 GCD 코드는 하나 개의 스레드를 사용하는 우선 순위 (추가)
  • GCD는

"실행 루프 물건을"처리 (시스템 이벤트) 수를 가질 수 있습니다

이 시도하고 결과를보고하십시오

for (NSString *key in myDictionary) { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     //process data 
    } 
} 
+0

바하마! 당신 말이 맞아요, 직접 코드를 입력했는데 잘못 했어요. 두 번째 방법을 사용하고 있습니다. 실수를 수정했습니다. 그것을 알아 주셔서 감사합니다. – Padin215

+0

그래서 어떻게 다른 스레드를 가지고 있는지 분명합니다. ;-) –

+0

네, 그게 내가 너무 빨리 타이핑하는 것입니다. = D – Padin215