2011-05-26 51 views
7

我只是想測試並行收集了一下,我用下面的代碼行(REPL):爲什麼使用並行集合不會更快?

(1 to 100000).par.filter(BigInt(_).isProbablePrime(100)) 

反對:

(1 to 100000).filter(BigInt(_).isProbablePrime(100)) 

但是水貨版本是不是更快。事實上,它甚至感覺有點慢(但我沒有真正測量過)。

有沒有人對於解釋?

編輯1:是的,我有一個多核處理器

編輯2:OK,我「解決」自己的問題。 isProbablePrime的實現似乎是問題,而不是平行集合。我用另一個函數替換isProbablePrime來測試素數,現在我得到了預期的加速比。

+0

並行只有更快,如果它讓你獲得更多的硬件起動,並且它也有開銷。 Scala的設置是爲了利用額外的內核? – 2011-05-26 21:18:46

+0

我不知道我必須設置任何東西。你有關於此的更多信息嗎? – 2011-05-26 21:27:08

+4

這裏沒有配置需要; Scala查找可用的內核數量,並將工作委託給適當大小的Fork-Join池。 – 2011-05-26 23:41:42

回答

6

無論是順序還是並行範圍,filter都將生成一個向量數據結構 - 分別爲VectorParVector

這是一個已知的問題是那些獲得從範圍集合生成並行矢量 - 用於並行矢量變壓器的方法(如filter)不構造並聯載體中。

對此的解決方案,使載體的高效並行建設已經被開發出來,但還沒有實現。我建議你提交一個ticket,以便它可以在下一個版本中修復。

+0

我不認爲這是問題所在。例如,如果我執行類似'(1到10000).par.filter(x => {Thread.sleep(1); true})'的命令'並行版本比順序版本快得多。所以並行執行似乎可行,但看起來像isProbablePrime不能同時在多個線程中運行(無論出於何種原因)。 – 2011-05-27 06:20:24

+0

沒錯 - 是的。但是,在這種情況下,處理每個元素所花費的時間比構造'ParVector'所需的時間要多得多(目前按順序完成),所以您不會注意到創建該向量所花費的時間。 'isProbablePrime'也應該並行執行,但是,並行運行它的好處應該由最後的順序構造來掩蓋。 – axel22 2011-05-27 07:51:29

+1

我想'isProbablePrime'有同步代碼相當大的部分,因爲我注意到另一件事是,連續的版本馬克塞斯一個核心,但其水貨版本相當平均分配負載。我想我應該停止使用'isProbablePrime'來測試並行的東西:) – 2011-05-27 11:08:06

相關問題