Низкая производительность GCD

Как вы, возможно, помните, я пытаюсь использовать 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 и просмотрел всю документацию, и я все еще чувствую, что мое понимание этого предмета в лучшем случае слабое. Спасибо!

9
задан Brad Larson 19 December 2011 в 20:10
поделиться