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
831 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!

sumber:php.cn
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