Heim > Backend-Entwicklung > C++ > Warum verlangsamt das Durchlaufen eines Arrays mit 8192 Elementen plötzlich mein Programm?

Warum verlangsamt das Durchlaufen eines Arrays mit 8192 Elementen plötzlich mein Programm?

DDD
Freigeben: 2024-12-17 04:47:25
Original
259 Leute haben es durchsucht

Why Does Looping Over an 8192-Element Array Suddenly Slow Down My Program?

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;
        }
    }
}
Nach dem Login kopieren

Dieser Code zeigt Leistungsvariabilität abhängig vom Wert von SIZE, erkennbar an der Ausführung Zeiten:

  • SIZE = 8191: 3,44 Sekunden
  • SIZE = 8192: 7,20 Sekunden
  • SIZE = 8193: 3,18 Sekunden

Verstehen Problem

Der Unterschied in den Ausführungszeiten kann auf ein bekanntes Problem namens Super-Alignment zurückgeführt werden:

  • Wenn SIZE ein Vielfaches von 2048 ist (d. h. in diesem Fall 8192) löst der Zugriff auf Elemente in bestimmten Mustern einen weniger effizienten Speicher aus Layout.

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;
        }
    }
Nach dem Login kopieren

Leistungsverbesserung

Nachher Durch Vertauschen der äußeren Schleifen verbessert sich die Leistung deutlich:

  • SIZE = 8191: 0,376 Sekunden
  • SIZE = 8192: 0,357 Sekunden
  • SIZE = 8193: 0,351 Sekunden

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage