1

은 여기, 간단한 수집 대 스칼라에서 병렬 컬렉션을 테스트 내 코드입니다 :스칼라 다른 병렬 구조

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 배. 평행선을 더욱 빠르게 만들 수있는 다른 옵션은 무엇입니까? 스칼라를 테스트하여 결과를 기꺼이 적어 두는 것이 좋습니다.

답변

1

선물을 사용하여 비동기 계산을 시작할 수 있습니다. 당신은 할 수 :

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 (너무 많은 요소 -> 너무 많은 선물 -> 더 오버 헤드)의 요소 수에 따라와 더 나쁜 결과를 얻을 수 있습니다 선물. 당신은이를 달성하기 위해 배우를 사용할 수

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

하지만 좀 더 배관을 필요로 :

는 ScalaMeter 0.5의 인라인 벤치마킹 기능을 사용하는 것이 좋습니다 제대로 벤치마킹되어 있는지 확인합니다.

+0

나는 미래와 벤치 마크를 사용했지만 갑자기 시간이 틀렸다는 것을 알았 는가? '발 시간 = 측정 { futureParse() } 에 println (들 "총 시간의 미래 : $ 시간") 데프 futureParse() { wn.allSynsets (POS.ADJECTIVE) .foreach 여기에 코드입니다 (adj => Future { parse (proc.mkDocument (adj.getGloss)) } } – Omid

+0

죄송합니다. 코드 예제를 작성하는 동안 피곤했을 것입니다. 선물이 완료 될 때까지 기다려야합니다. 나는 각 요소를'Future'에 매핑하고 미래가 끝날 때까지 기다리는 대답을 편집했습니다. – axel22