Kekeliruan Prestasi Lelaran: std::array vs. std::vector
Dalam siasatan sebelum ini, didapati bahawa lelaran melalui std::array nyata lebih pantas daripada lelaran melalui std::vector. Untuk membetulkan pemerhatian yang cacat ini, penanda aras baharu telah dicipta, mendedahkan pembalikan yang mengejutkan: lelaran melalui std::vector kini jauh lebih pantas.
Untuk mengelakkan kemungkinan pengoptimuman, hasil gelung telah disertakan dan - Bendera O3 telah didayakan. Selain itu, std::chrono telah digunakan untuk pemasaan yang tepat, mengasingkan pelaksanaan gelung.
Hasilnya sangat menarik:
std::array:
$ ./a.out result: 0 time: 99.554109
std::vector:
$ g++ arrVsVec.cpp -O3 $ ./a.out result: 0 time: 30.734491
Merungkai Misteri
Setelah memeriksa pembongkaran dalam Godbolt, ia menjadi jelas bahawa percanggahan prestasi berpunca daripada residensi halaman memori dalam ruang alamat proses. Walaupun std::vector telah diperuntukkan dan diisi sifar, std::array telah disimpan dalam bahagian .bss global bagi executable dan halamannya belum dihalakan.
Menyelesaikan the Issue
Untuk menyelesaikan percanggahan ini, adalah perlu untuk membawa halaman std::array ke dalam ruang alamat. Ini boleh dicapai dengan menambah baris berikut pada permulaan fungsi utama:
std::fill_n(v.data(), n, 1); // included in <algorithm>
atau secara alternatif, pada Linux, menggunakan mlock():
mlock(v.data(), v.size() * sizeof(v[0]));
Kesimpulan
Tanda aras ini menyerlahkan kepentingan pemastautin halaman dalam prestasi lelaran. Dengan memastikan bahawa halaman kedua-dua std::array dan std::vector hadir dalam ruang alamat, prestasi lelaran boleh dipertingkatkan dengan ketara.
Atas ialah kandungan terperinci Mengapa Mengulangi melalui `std::vector` Lebih Pantas daripada `std::array` dalam Penanda Aras Ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!