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:
Memahami Isu
Perbezaan masa pelaksanaan boleh dikaitkan dengan isu yang diketahui dikenali sebagai penjajaran super:
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:
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!