Wie Sie sich vielleicht erinnern, versuche ich, GCD zu verwenden, um einen Teil meines Codes zu beschleunigen, nämlich eine Kollisionserkennung und eine Auflösungsmaschine. Allerdings mache ich offensichtlich etwas falsch, denn mein gesamter GCD-Code ist deutlich langsamer und weniger konsistent als mein serieller Code (zwischen 1,4x und 10x langsamer). Erlauben Sie mir, Ihnen ein Beispiel zu geben: Ich iteriere über ein Array in einer Bubble-Sortierweise, um alle möglichen Kollisionen zwischen den Objekten in diesem Array zu ermitteln:
- (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;
}
Ziemlich einfach, und es scheint angesichts der Einschränkungen des Problems gut zu funktionieren. Ich möchte jedoch die Tatsache ausnutzen, dass der Zustand der einzelnen Objekte im Codeabschnitt nicht geändert wird, und GCD verwenden, um diese Arbeit zu parallelisieren. Um dies zu erreichen, versuche ich etwas in der Art:
- (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;
}
Kann mir jemand helfen, mich auf den richtigen Weg zu bringen und vielleicht einen Link zu einem guten GCD-Tutorial zur Verfügung stellen? Ich habe mir mehrere GCD-Tutorials angesehen und die gesamte Dokumentation durchforstet, und ich habe immer noch das Gefühl, dass mein Verständnis für das Thema bestenfalls dürftig ist. Vielen Dank!