Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah lelaran melalui std::vector lebih pantas daripada std::array dalam penanda aras saya?

Mengapakah lelaran melalui std::vector lebih pantas daripada std::array dalam penanda aras saya?

Patricia Arquette
Patricia Arquetteasal
2024-11-02 03:19:02183semak imbas

Why is iterating through std::vector faster than std::array in my benchmark?

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:

  • Memastikan hasil gelung digunakan untuk mengelakkan peninggalan pengoptimuman.
  • Menggunakan bendera -O3 untuk peningkatan kelajuan.
  • Menggunakan std::chrono untuk mengasingkan ukuran kepada gelung for sahaja.

Keputusan Penanda Aras

Pemasa penanda aras yang terhasil menunjukkan bahawa, bertentangan dengan andaian awal:

  • std::array: Masa pelaksanaan = 99.554109 milisaat
  • std::vektor: Masa pelaksanaan = 30.734491 milisaat

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!

Kenyataan:
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