Rumah >pembangunan bahagian belakang >C++ >Mengapa Menggelung pada Tatasusunan Elemen 8192 Secara Tiba-tiba Memperlahankan Program Saya?

Mengapa Menggelung pada Tatasusunan Elemen 8192 Secara Tiba-tiba Memperlahankan Program Saya?

DDD
DDDasal
2024-12-17 04:47:25267semak imbas

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

Mengapa Program Lambat Apabila Menggulung Lebih 8192 Elemen

Pertimbangkan coretan kod berikut:

#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;
        }
    }
}

Kod ini mempamerkan kebolehubahan prestasi bergantung pada nilai SIZE, seperti yang dilihat oleh pelaksanaannya kali:

  • SAIZ = 8191: 3.44 saat
  • SAIZ = 8192: 7.20 saat
  • SAIZ = 8193: 3.18 saat

Memahami Isu

Perbezaan masa pelaksanaan boleh dikaitkan dengan isu yang diketahui dikenali sebagai penjajaran super:

  • Apabila SIZE ialah gandaan 2048 (iaitu, 8192 dalam kes ini), mengakses elemen dalam corak tertentu mencetuskan memori yang kurang cekap susun atur.

Pengurusan Memori

Malloc/free tidak bertanggungjawab secara langsung untuk perbezaan prestasi.

Pemesanan Gelung Luar

Satu lagi isu utama dalam kod ini ialah susunan gelung luar. Kod asal melelaran mengikut lajur matriks, manakala lelaran mengikut baris lebih cekap untuk akses memori.

Penyelesaian

Untuk mengurangkan isu prestasi, gelung luar harus ditukar ganti:

    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;
        }
    }

Prestasi Penambahbaikan

Selepas menukar gelung luar, prestasi bertambah baik dengan ketara:

  • SAIZ = 8191: 0.376 saat
  • SAIZ = 8192: 0.357 saat
  • SAIZ = 8193: 0.351 saat

Atas ialah kandungan terperinci Mengapa Menggelung pada Tatasusunan Elemen 8192 Secara Tiba-tiba Memperlahankan Program Saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn