Ayak Eratosthenes untuk Generasi Perdana
Dalam kes anda, pelaksanaan berurutan Ayak Eratosthenes berprestasi lebih baik daripada versi serentak kerana overhed yang diperkenalkan oleh benang . Berikut ialah beberapa sebab yang mungkin:
-
Thread Overhed: Mencipta dan mengurus thread memerlukan overhed dari segi peruntukan memori, penjadualan, penyegerakan dan penukaran konteks. Overhed ini boleh mengurangkan prestasi algoritma serentak dengan ketara, terutamanya apabila berurusan dengan bilangan prima yang agak kecil.
-
Tugas Berbutir Halus: Tugas menjana nombor prima dalam julat tertentu ialah agak kecil dan boleh dikendalikan dengan mudah oleh satu benang. Mencipta berbilang benang untuk mengendalikan tugas kecil sedemikian boleh memperkenalkan overhed yang tidak perlu dan meningkatkan kerumitan kod.
-
Penyegerakan: Dalam pelaksanaan serentak, utas perlu menyelaras antara satu sama lain untuk mengelak daripada menjana prima yang sama beberapa kali dan pastikan semua prima dijana. Proses penyegerakan ini boleh memperkenalkan overhed tambahan dan memperlahankan prestasi.
-
Lokasi Cache: Versi berjujukan algoritma mempunyai lokaliti cache yang lebih baik berbanding versi serentak. Dalam algoritma berjujukan, data yang diakses oleh gelung terletak dalam memori bersebelahan, menjadikannya lebih berkemungkinan berada dalam cache. Sebaliknya, versi serentak mungkin melibatkan akses data daripada urutan yang berbeza, yang mungkin tiada dalam cache dan boleh mengakibatkan kehilangan cache.
Untuk meningkatkan prestasi pelaksanaan serentak anda, pertimbangkan strategi berikut :
-
Tingkatkan Kiraan Benang: Jika bilangan teras yang tersedia lebih besar daripada bilangan utas yang anda gunakan, cuba tingkatkan kiraan benang untuk mengagihkan beban kerja dengan lebih sekata.
-
Tugas Berbutir Kasar: Bahagikan julat nombor kepada ketulan yang lebih besar dan tetapkan setiap ketul kepada benang yang berasingan. Ini akan mengurangkan bilangan titik penyegerakan dan meningkatkan prestasi.
-
Struktur Data Tanpa Kunci: Gunakan struktur data tanpa kunci, seperti pembolehubah atom atau operasi bandingkan-dan-swap, untuk elakkan perbalahan dan tingkatkan kecekapan penyegerakan.
-
Keputusan Cache: Simpan bilangan prima yang dijana dalam struktur data kongsi yang boleh diakses oleh semua utas, mengurangkan keperluan bagi setiap utas untuk menghasilkan bilangan prima yang sama .
-
Penanda aras: Jalankan penanda aras untuk mengukur prestasi kod anda dalam keadaan berbeza dan kenal pasti sebarang kemungkinan kesesakan.
Selain itu, berikut ialah beberapa pengoptimuman khusus yang anda boleh memohon pada kod anda:
-
Gunakan bitset dan bukannya tatasusunan bait: Bitset lebih cekap untuk menyimpan bendera perdana dan ia menyediakan operasi bitwise yang lebih pantas.
-
Elakkan urutan yang tidak perlu penyegerakan: Hanya segerakkan apabila benar-benar perlu, seperti semasa mengemas kini struktur data kongsi.
-
Optimumkan prestasi gelung: Gunakan gelung tertanggal atau arahan SIMD untuk meningkatkan prestasi gelung dalam.
-
Gunakan bilangan prima yang diprakira: Simpan senarai bilangan prima yang diprakira dan gunakannya untuk menyemak bilangan prima kecil dengan cepat.
Dengan menangani isu ini, anda seharusnya dapat meningkatkan prestasi pelaksanaan serentak anda dan menjadikannya lebih pantas daripada versi berjujukan.
Atas ialah kandungan terperinci Mengapakah pelaksanaan serentak saya bagi Ayak Eratosthenes lebih perlahan daripada versi berjujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!