1

我VS簡單集合斯卡拉上測試並行收集,這裏是我的代碼:斯卡拉不同的並行結構

def parallelParse() 
    { 
    val adjs = wn.allSynsets(POS.ADJECTIVE).par 
    adjs.foreach(adj => { 
     parse(proc.mkDocument(adj.getGloss)) 
    }) 
    } 

    def serialParse() 
    { 
    val adjs = wn.allSynsets(POS.ADJECTIVE) 
    adjs.foreach(adj => { 
     parse(proc.mkDocument(adj.getGloss)) 
    }) 
    } 

並行採集速度達到3倍左右。 Scala還有哪些其他選項可以讓它更快地並行運行,我很樂意測試它們並將結果放在這裏。

回答

1

您可以使用futures來啓動異步計算。你可以這樣做:

import scala.concurrent._ 
import scala.concurrent.duration._ 
import ExecutionContext.Implicits.global 
val futures = wn.allSynsets(POS.ADJECTIVE).map(adj => Future { 
    parse(proc.mkDocument(adj.getGloss)) 
}) 
futures.foreach(f => Await.ready(f, Duration.Inf)) 

根據工作的每個元素在allSynsets量和元素的allSynsets(太多的元素 - >過多期貨 - >更多的開銷)的數量,你可以得到與更壞的結果期貨。

爲了確保您正確基準,考慮使用的ScalaMeter 0.5直列基準化功能:

http://scalameter.github.io/home/gettingstarted/0.5/inline/index.html

你也可以用演員來實現這一點,但它需要更多的管道。

+0

我使用了未來和基準,但它突然報告不確定的時間,任何想法?下面是代碼: 'VAL時間=度量{ futureParse() } 的println(S 「總時間的未來:$時間」) 高清futureParse(){ wn.allSynsets(POS.ADJECTIVE).foreach ()=>未來{proc.mkDocument(adj.getGloss)} }) }' – Omid

+0

對不起,我在編寫代碼示例時一定很累。你必須等待期貨完成。我編輯了我的答案,將每個元素映射到「Future」,然後等待每個期貨完成其工作。 – axel22