Perbezaan Prestasi antara Lelaran melalui std::array dan std::vector
Tanda aras saya sebelum ini, yang cuba menilai prestasi lelaran bagi std::array dan std::vector, mengandungi beberapa ketidaksempurnaan. Walau bagaimanapun, apabila menyemak semula isu itu, saya mendapati bahawa std::vector sebenarnya, lebih pantas daripada std::array.
Untuk mengurangkan sebarang potensi pengoptimuman, saya menggunakan beberapa langkah, termasuk:
Masa pelaksanaan yang terhasil untuk kedua-dua struktur data adalah seperti berikut:
std::array:
$ g++ arrVsVec.cpp -O3 $ ./a.out result: 0 time: 99.554109
std::vector:
$ g++ arrVsVec.cpp -O3 $ ./a.out result: 0 time: 30.734491
Sebab Percanggahan:
Percanggahan prestasi berpunca daripada halaman memori std::array tidak bermastautin dalam alamat proses angkasa lepas. Khususnya, skop global std::array berada dalam bahagian .bss boleh laku, yang belum dihalakan dan dimulakan kepada sifar. Sebaliknya, std::vector telah diperuntukkan dan dimulakan kepada sifar, menyebabkan halaman memorinya sudah ada dalam ruang alamat.
Menyelesaikan Isu:
Untuk menghapuskan isu ini dan menunjukkan pariti antara dua struktur data, seseorang boleh menambah kod berikut sebagai baris pertama utama untuk membawa halaman masuk:
<code class="cpp">std::fill_n(v.data(), n, 1); // included in <algorithm></code>
Sebagai alternatif, pada sistem Linux, satu boleh menggunakan mlock(v.data(), v.size() * sizeof(v[0])); untuk memaksa halaman masuk ke dalam ruang alamat. Rujuk halaman manual man mlock untuk butiran lanjut.
Atas ialah kandungan terperinci Mengapa std::vector Lebih Cepat daripada std::array dalam Lelaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!