Secara amnya diandaikan bahawa algoritma serentak adalah lebih pantas daripada algoritma berjujukan. Walau bagaimanapun, dalam kod yang diberikan, versi serentak algoritma Sieve of Eratosthenes adalah lebih perlahan daripada versi berjujukan. Artikel ini meneroka sebab di sebalik hasil yang tidak dijangka ini, menyerlahkan potensi isu dalam kod yang disediakan dan mencadangkan beberapa pengoptimuman untuk meningkatkan prestasi kedua-dua pelaksanaan berurutan dan serentak.
Kelas PrimesSeq melaksanakan versi berjujukan algoritma Sieve of Eratosthenes. Ia menggunakan bitArr tatasusunan bait untuk mewakili penapis. Setiap bit dalam tatasusunan mewakili nombor, dan jika bit ditetapkan, nombor itu ditandakan sebagai bukan perdana. Algoritma melelaran ke atas ayak, bermula dari 2, dan menandakan semua gandaan nombor semasa sebagai bukan perdana. Fungsi isPrime menyemak sama ada nombor adalah perdana dengan menyemak sama ada bit yang sepadan dalam penapis tidak ditetapkan. Fungsi printAllPrimes mencetak semua nombor perdana yang ditemui oleh algoritma.
Kelas PrimesPara melaksanakan versi serentak algoritma Sieve of Eratosthenes. Ia membahagikan ayak kepada beberapa ketulan dan memberikan setiap ketulan kepada benang yang berasingan. Setiap utas bertanggungjawab untuk menandakan gandaan nombor yang diberikan kepadanya sebagai bukan perdana. Benang utama bertanggungjawab untuk menjana nombor perdana dan memulakan benang. Fungsi crossOut digunakan untuk menandakan nombor sebagai bukan perdana. Fungsi generateErastothenesConcurrently menjana nombor perdana secara serentak.
Dalam kod yang diberikan, versi serentak algoritma adalah kira-kira 10 kali lebih perlahan daripada versi berjujukan. Ini tidak dijangka kerana algoritma serentak biasanya lebih pantas daripada yang berurutan.
Terdapat beberapa kemungkinan kesesakan dalam kod yang disediakan:
Terdapat beberapa pengoptimuman yang boleh digunakan pada kedua-dua pelaksanaan berjujukan dan serentak:
Walaupun algoritma serentak biasanya lebih pantas daripada berjujukan satu, terdapat kes di mana algoritma berjujukan mungkin lebih pantas. Dalam kes algoritma Sieve of Eratosthenes, overhed penciptaan benang dan penyegerakan, perkongsian palsu dan ketidakseimbangan beban boleh mengatasi faedah konkurensi.
Dengan menggunakan pengoptimuman yang diterangkan dalam artikel ini, adalah mungkin untuk meningkatkan prestasi kedua-dua pelaksanaan berurutan dan serentak bagi algoritma Ayak Eratosthenes.
Atas ialah kandungan terperinci Mengapa Penayak Serentak Algoritma Eratosthenes Lebih Lambat Daripada Versi Berjujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!