2014-05-16 3 views
0

대기열을 많이 생성해야하는 경우 (예 : 이미지로드에 10 개 이상 대기열) 글로벌 동시 대기열을 사용하거나 동일한 수의 사설 작업 발송 대기열을 만드는 것이 더 빠릅니까? 쿼드 코어 CPU의 경우 동시 대기열이 4 개의 동시 대기열로 제한되어 연속 대기열 작업의 직렬 대기열로 바뀝니 까?동시 대기열 대 사설 발송 대기열

+1

FYI - 더 많은 질문을 게시하기 전에 최근의 몇 가지 질문으로 돌아가서 투표를해야하는지 또는 일부 답변을 수락해야하는지 확인해야합니다. 지난 몇 가지 질문 중 몇 가지를 수락하지 않았습니다. 답변을 수락하면 질문이 종료되고 평판이 나옵니다. – rmaddy

답변

1

얼마나 많은 동시 작업이 허용되는지를 제한하는 고유의 동시 대기열을 만드는 것이 좋습니다. 예를 들어, maxConcurrentOperationCount이 4 또는 5로 설정된 단일 동시 NSOperationQueue을 만들 수 있습니다. 그런 다음 동기 이미지 검색 요청을 모두 추가하십시오. 예를 들어 :

[queue addOperationWithBlock:^{ 
    // request image 
}]; 

당신은보다 애호가 얻을 수 있지만, 이것은 당신이 개 제안을 어떤 기본적인 대안 :

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
queue.maxConcurrentOperationCount = 5; 

은 그럼 그냥 같은 것을 사용하여 이미지의 모든 요청을 추가 할 수 있습니다. 그러나 이렇게하면 동시 네트워크 요청 수가 5 개를 넘지 않게됩니다.

GCD 제안뿐만 아니라이 기능이 작동하려면 작업 자체가 동기되어야합니다. 동기가 아닌 경우 작업이 수행 할 때까지 작업이 완료되지 않도록 추가 작업을 수행해야합니다.

NSOperation *operation = [NSBlockOperation operationWithBlock:^{ 
    // do network request here 
}]; 

[completionOperation addDependency:operation]; 

[queue addOperation:operation]; 

그리고 완료되면 모든 대기열 : 그런 다음 작업을 추가

NSOperation *completionOperation = [NSBlockOperation operationWithBlock:^{ 
    // this is what will happen when they're done 
}]; 

: 당신은 그들이 모두 완료하면, 당신은 완료 작업을 사용할 수 있습니다 알고 싶다면


그런 다음 완료 작업을 대기열에 넣을 수 있습니다. 나머지 작업이 완료 될 때까지 실행되지 않습니다 (두 작업 사이의 종속 관계가 선언 되었기 때문에) :

[queue addOperation:completionOperation]; 
0

빠른 작업은 작업에 따라 다릅니다.

전역 동시 대기열은 동시 작업 수를 사용 가능한 하드웨어와 일치 시키려고 시도합니다. 그것은 문서화되지 않았기 때문에 코어의 수와 일치하거나 일치하지 않을 수 있습니다 (또는 코어가 하이퍼 스레드이고 작업이 허용되는 경우 코어 수를 두 배로 늘릴 수도 있습니다). 대기중인 작업 (예 : 네트워크 작업 또는 디스크 I/O)이 차단되면 글로벌 대기열이 새로운 작업을 시작합니다.

독자적으로 대기열을 만들어 문제를 강제로 실행할 수 있지만 이는 도움이되지 않습니다. 4 개의 코어가있는 경우 10 개 또는 20 개의 큐 또는 동시 CPU가 많은 동시 작업을 수행하는 것이 전반적인 속도를 향상시키는 데 도움이되지 않습니다. 리소스를 최대한 활용하면 최대한으로 활용할 수 있으며 개인 큐를 추가하면 변경되지 않습니다.