Rumah > pembangunan bahagian belakang > C++ > Mengapa Mengulangi melalui `std::vector` Lebih Pantas daripada `std::array` dalam Penanda Aras Ini?

Mengapa Mengulangi melalui `std::vector` Lebih Pantas daripada `std::array` dalam Penanda Aras Ini?

Linda Hamilton
Lepaskan: 2024-11-01 14:50:02
asal
880 orang telah melayarinya

Why is Iterating through `std::vector` Faster than `std::array` in This Benchmark?

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
Salin selepas log masuk

std::vector:

$ g++ arrVsVec.cpp -O3
$ ./a.out
result: 0
time: 30.734491
Salin selepas log masuk

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>
Salin selepas log masuk

atau secara alternatif, pada Linux, menggunakan mlock():

mlock(v.data(), v.size() * sizeof(v[0]));
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan