Mengapa Lelaran Melalui std::vector Lebih Cepat daripada Lelaran Melalui std::array
Dalam penanda aras sebelumnya, diandaikan bahawa lelaran melalui std::array akan menjadi lebih cepat daripada lelaran melalui std::vector. Walau bagaimanapun, semakan penanda aras seterusnya mendedahkan bahawa std::vector sebenarnya adalah pilihan yang lebih pantas. Artikel ini mengkaji sebab di sebalik penemuan yang tidak dijangka ini.
Penambahbaikan Penanda Aras
Penanda aras yang dipertingkatkan menangani kelemahan berikut dalam pelaksanaan asal:
Keputusan Penanda Aras
Pemasa penanda aras yang terhasil menunjukkan bahawa, bertentangan dengan andaian awal:
Analisis
Perbezaan yang diperhatikan dalam prestasi perbezaan pengurusan memori antara std::array dan std::vector. Dalam kes std::array, tatasusunan skop global pada mulanya disimpan dalam bahagian .bss boleh laku, yang berada dalam memori bukan halaman. Akibatnya, apabila std::array diakses buat kali pertama, halaman memori bermasalah, mengakibatkan overhed prestasi.
Sebaliknya, std::vector memperuntukkan dan mengisi sifar halaman memorinya pada ciptaan. Ini memastikan bahawa halaman sudah ada dalam ingatan apabila gelung berulang ke atas vektor.
Untuk menggambarkan konsep ini, satu baris kod telah ditambahkan pada permulaan fungsi utama untuk membawa halaman memori std ::array ke dalam ruang alamat:
<code class="cpp">std::fill_n(v.data(), n, 1);</code>
Dengan pra-fault halaman, masa pelaksanaan std::array dikurangkan untuk menyamai std::vector.
Kesimpulan
Perbezaan prestasi antara lelaran melalui std::array dan std::vector timbul daripada mekanisme pengurusan memori. Pra-menyalahkan halaman std::array atau menjalankan program pada sistem pengendalian yang menyokong mlock boleh meningkatkan prestasi std::array agar sepadan dengan std::vector.
Atas ialah kandungan terperinci Mengapakah lelaran melalui std::vector lebih pantas daripada std::array dalam penanda aras saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!