2010-07-14 2 views
1

NSOperationQueue를 사용하여 첫 번째 다중 스레드 iPhone 응용 프로그램을 작성하고 있습니다.로드가 더 좋고 잠재적으로 자신의 스레드 디스패치를 ​​관리하는 것보다 빠르기 때문입니다.NSOperationQueue 쓰레드가 느리게 디스패치됩니까?

보드 게임을 별도의 조각으로 나눠서 각각의 보드를 계산 한 후 각 보드를 다시 연결하여 게임의 결과를 계산합니다. 엄청난 오버 헤드로도 빠른 방법처럼 보입니다. 분열과 접합의. 각 보드에 대해 NSInvocationOperation 개체를 만든 다음 OperationQueue로 보냅니다. 보드의 모든 부분을 보낸 후에는 모두 앉아 기다렸다가 기다리는 동안 WaitUntilAllOperationsAreFinished OperationQueue를 호출하여 계산을 마칠 때까지 기다립니다.

이것은 작동해야하는 것처럼 보입니다. 스레드는 매우 잘 작동하지만 스레드는 매우 slooooowwwlllyyyyyy로 불려서 결국 실제로는 단일 스레드 버전보다 계산에 더 오래 걸립니다. 오네! 나는 NSOperationQueue로 보내지는 NSOperations의 생성과 종료를 모니터하고, 얼마 후에 Operation Queue do-diddly-daddlin에 잠시 앉아서 잠시 후에 호출하는 것을 발견했습니다. 처음에는 "어쩌면 대기열이 한 번에 많은 스레드 만 처리 할 수 ​​있습니다"라고 생각한 다음 Queue maxConcurrentOperationCount를 임의의 높은 숫자 (보드 조각보다 훨씬 많음)까지 올렸지 만 동일한 것을 경험했습니다!

어쩌면 누군가가 NSOperationQueue를 "오버 드라이브"로 걷어내어 가능한 빨리 대기열을 보내도록 할 수 있는지 궁금합니다.

답변

0

대기열은 기본적으로 전화기의 처리 능력에 따라 제한됩니다. 전화가 두 개의 프로세스 만 동시에 실행할 수있는 경우 작업을 분할하여 최대 2 배까지 속도가 향상됩니다. 그보다 더 많은 것, 그리고 당신은 아무런 이득도 얻지 못하는 오버 헤드를 추가하고 있습니다.

특히 보드 계산과 같이 프로세서 및 메모리 집약적 인 루틴을 실행하는 경우에 특히 그렇습니다. NSOperationQueue는 오랜 시간 동안 기다려야하는 몇 가지 작업이 있다면 의미가 있습니다. 사용자 인터페이스 루프 및 네트워크 다운로드는 훌륭한 예입니다. 이 경우, 비활성 조작이 입력을 기다리는 동안 다른 조작을 완료 할 수 있습니다.

보드와 같은 경우 그리드의 각 부분에 대한 작업에는 절대로 대기 조건이 없습니다. 완료 될 때까지 항상 최고 속도로 떠내려갑니다.

은 참조 : iPhone Maximum thread limit?concurrency application design

+2

상용화 된 iPhone이 두 개의 스레드도 동시에 실행할 수 없다는 점은 중요합니다. 그들은 모두 단일 코어 칩입니다. CPU 바운드 작업의 경우 스레딩은 시간 낭비입니다. –

+0

좋은 지적. 심지어 A4는 여전히 단일 코어 프로세서입니다. http://en.wikipedia.org/wiki/Apple_A4 –

1

스레드 마술 빠른 프로세서 실행하지 않습니다.

단일 프로세서 시스템에서 알고리즘 실행에 100 만 명령이 필요한 경우이를 10 개의 명령으로 10 개의 덩어리로 분할하여 10 개의 스레드에서 실행하는 경우에도 마찬가지입니다. 실제로 스레드 간 분할, 병합 및 컨텍스트 전환의 오버 헤드가 추가되었으므로 시간이 오래 걸립니다.

관련 문제