Dilema Pengurusan Memori dalam Program dengan Perlaksanaan Lambat
Apabila atur cara berulang pada bilangan elemen tertentu, terutamanya 8192, ia boleh mempamerkan kelembapan ketara. Fenomena ini berpunca daripada pengurusan ingatan, topik rumit yang memerlukan penerokaan lanjut.
Gambaran Keseluruhan Kod
Pertimbangkan gelung yang dipersoalkan, yang menjalankan operasi pada matriks yang telah ditetapkan:
for (i = 1; i < SIZE - 1; i++) { for (j = 1; j < SIZE - 1; j++) { res[j][i] = 0; for (k = -1; k < 2; k++) for (l = -1; l < 2; l++) res[j][i] += img[j + l][i + k]; res[j][i] /= 9; } }
Percanggahan prestasi program timbul daripada jenis susun atur memori yang digunakan. Apabila mengakses tatasusunan, pemproses moden memilih blok memori bersebelahan untuk kecekapan optimum. Walau bagaimanapun, apabila gelung berulang ke atas elemen dalam cara bukan linear, seperti yang berlaku dalam kod yang disediakan, pemproses mungkin menghadapi gerai memori semasa ia cuba mengakses data bukan urutan.
Super- Isu Penjajaran dan Cache
Inti isu terletak pada "penjajaran super," fenomena di mana pemproses lebih suka mengakses blok memori iaitu gandaan saiz tertentu, selalunya 16 atau 32 bait. Dalam kes ini, gelung luar berulang ke atas baris, manakala gelung dalam melelaran ke atas lajur. Apabila SIZE ialah gandaan 2048, gelung luar melangkau sebahagian besar memori antara baris, menyebabkan pemproses mengalami kelewatan semasa menunggu data.
Perbandingan Prestasi
Masa pelaksanaan berikut menunjukkan prestasi impak:
SIZE = 8191: 3.44 secs SIZE = 8192: 7.20 secs SIZE = 8193: 3.18 secs
Penyelesaian: Menyusun Semula Gelung
Penyelesaian kepada isu ini adalah dengan menyusun semula gelung supaya gelung luar berulang ke atas lajur dan bukannya baris. Ini memastikan program mengakses blok memori bersebelahan, menghapuskan akses tidak berurutan yang menyebabkan kelembapan.
Gelung yang diubah suai:
for (j = 1; j < SIZE - 1; j++) { for (i = 1; i < SIZE - 1; i++) { ... (same operations as before) ... } }
Dengan melaksanakan pengubahsuaian ini, perbezaan prestasi hilang, seperti yang dilihat dalam masa pelaksanaan berikut:
SIZE = 8191: 0.376 seconds SIZE = 8192: 0.357 seconds SIZE = 8193: 0.351 seconds
Atas ialah kandungan terperinci Mengapa Program Saya Perlahan Dengan Ketara Apabila Memproses Elemen 8192 Kerana Corak Capaian Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!