Как вы, возможно, помните, я пытаюсь использовать GCD для ускорения некоторой части моего кода, а именно механизма обнаружения и разрешения столкновений. Однако я явно делаю что-то не так, потому что весь мой код GCD значительно медленнее и менее согласован, чем мой последовательный код (от 1,4x до 10x медленнее). Позвольте мне привести пример: я выполняю итерацию по массиву методом пузырьковой сортировки, чтобы определить все возможные столкновения между объектами в этом массиве:
- (double) detectCollisionsInArray:(NSArray*)objects
{
int count = [objects count];
if (count > 0)
{
double time = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < count; i++)
{
for (int j = i + 1; j < count; j++)
{
/** LOTS AND LOTS OF WORK FOR EACH OBJECT **/
}
}
return CFAbsoluteTimeGetCurrent() - time;
}
return 0;
}
Довольно просто, и, похоже, он хорошо работает с учетом ограничений проблемы. Однако, Я хотел бы воспользоваться тем фактом, что состояние каждого объекта не изменяется в разделе кода, и использовать GCD для распараллеливания этой работы. Для этого я пытаюсь сделать что-то вроде этого:
- (double) detectCollisionsInArray:(NSArray*)objects
{
int count = [objects count];
if (count > 0)
{
NSOperationQueue* opQueue = [[NSOperationQueue alloc] init];
NSBlockOperation* blockOperation = nil;
double time = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < count; i++)
{
for (int j = i + 1; j < count; j++)
{
void (^workBlock) (void) = ^()
{
/** LOTS AND LOTS OF WORK FOR EACH OBJECT **/
};
if (!blockOperation)
{
blockOperation = [NSBlockOperation blockOperationWithBlock:b];
}
else
{
[blockOperation addExecutionBlock:workBlock];
}
}
}
[opQueue addOperation:blockOperation];
[opQueue autorelease];
return CFAbsoluteTimeGetCurrent() - time;
}
return 0;
}
Может ли кто-нибудь помочь мне на правильном пути и, возможно, предоставить ссылку на хорошее руководство по GCD? Я просмотрел несколько руководств по GCD и просмотрел всю документацию, и я все еще чувствую, что мое понимание этого предмета в лучшем случае слабое. Спасибо!