Warum das Programm beim Durchlaufen von 8192 Elementen langsamer wird
Bedenken Sie den folgenden Codeausschnitt:
#define SIZE 8192 float img[SIZE][SIZE]; // input image float res[SIZE][SIZE]; // result of mean filter int main() { // Initialization for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { img[j][i] = (2 * j + i) % 8196; } } // Matrix processing - applying mean filter for (int i = 1; i < SIZE - 1; i++) { for (int j = 1; j < SIZE - 1; j++) { res[j][i] = 0; for (int k = -1; k < 2; k++) { for (int l = -1; l < 2; l++) { res[j][i] += img[j + l][i + k]; } } res[j][i] /= 9; } } }
Dieser Code zeigt Leistungsvariabilität abhängig vom Wert von SIZE, erkennbar an der Ausführung Zeiten:
Verstehen Problem
Der Unterschied in den Ausführungszeiten kann auf ein bekanntes Problem namens Super-Alignment zurückgeführt werden:
Speicherverwaltung
Malloc/free ist nicht direkt für den Leistungsunterschied verantwortlich.
Outer Loop Ordering
Ein weiteres wichtiges Thema in diesem Code ist die Reihenfolge der äußeren Schleifen. Der ursprüngliche Code iteriert die Matrix spaltenweise, während die zeilenweise Iteration effizienter für den Speicherzugriff ist.
Lösung
Um das Leistungsproblem zu lindern, werden die äußeren Schleifen verwendet sollte ausgetauscht werden:
for (int j = 1; j < SIZE - 1; j++) { for (int i = 1; i < SIZE - 1; i++) { res[j][i] = 0; for (int k = -1; k < 2; k++) { for (int l = -1; l < 2; l++) { res[j][i] += img[j + l][i + k]; } } res[j][i] /= 9; } }
Leistungsverbesserung
Nachher Durch Vertauschen der äußeren Schleifen verbessert sich die Leistung deutlich:
Das obige ist der detaillierte Inhalt vonWarum verlangsamt das Durchlaufen eines Arrays mit 8192 Elementen plötzlich mein Programm?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!