通常認為並發演算法比順序演算法更快。然而,在給定的程式碼中,埃拉托斯特尼篩演算法的並發版本比順序版本慢。本文探討了這種意外結果背後的原因,重點介紹了所提供程式碼中的潛在問題,並提出了一些最佳化建議,以提高順序實現和並發實現的效能。
PrimesSeq 類別實作了埃拉托斯特尼篩法演算法的順序版本。它使用位元組數組bitArr來表示篩子。數組中的每一位代表一個數字,如果該位元被設置,則該數字被標記為非素數。演算法從 2 開始迭代篩子,並將目前數字的所有倍數標記為非素數。 isPrime 函數透過檢查篩選中的對應位是否未設定來檢查數字是否為質數。 printAllPrimes 函數列印演算法找到的所有質數。
PrimesPara 類別實現埃拉托斯特尼篩法演算法的並發版本。它將篩子分成多個區塊,並將每個區塊分配給一個單獨的執行緒。每個執行緒負責將分配給它的數字的倍數標記為非素數。主執行緒負責產生初始素數並啟動執行緒。 crossOut 函數用於將數字標記為非素數。 generateErastothenesConcurrently 函數同時產生質數。
在給定的程式碼中,該演算法的並發版本比順序版本慢約 10 倍。這是意想不到的,因為並發演算法通常比順序演算法更快。
提供的程式碼中有一些潛在的瓶頸:
有一些最佳化可以應用於順序和並發實現:
雖然並發演算法通常比順序演算法更快一些情況下,順序演算法可能會更快。在埃拉托斯特尼篩法演算法的情況下,執行緒創建和同步、錯誤共享和負載不平衡的開銷可能會超過並發帶來的好處。
透過應用本文中所述的最佳化,可以提高埃拉托斯特尼篩法演算法的順序和並發實現的效能。
以上是為什麼並發埃拉托色尼演算法比順序版本慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!