2014-10-14 5 views
6

나는 scalaz-streams sink에 관한 이상한 관찰을 가지고있다. 그들은 천천히 일하고 있습니다. 아무도 왜 그런지 압니까? 그리고 성능을 향상시킬 수있는 방법이 있습니까? 7S이 하나가 실행 33 개의 초 정도 걸립니다싱크대의 코드 성능을 향상시키는 방법은 무엇입니까?

//p is the same as before 

def printToImage(img: BufferedImage)(pixel: Pixel): Unit = { 
    img.setRGB(pixel.x, pixel.y, 1, 1, Array(pixel.rgb), 0, 0) 
} 

//I've found that way of doing sink in some tutorial 
def getImageSink(img: BufferedImage): Sink[Task, Pixel] = { 
    //I've tried here Task.delay and Task.now with the same results 
    def printToImageTask(img: BufferedImage)(pixel: Pixel): Task[Unit] = Task.delay { 
    printToImage(img)(pixel) 
    } 
    Process.constant(printToImageTask(img)) 
} 



val image = getBlankImage(2000, 4000) 
val result = p.to(getImageSink(image)).run.run 

싱크

버전을 실행하는 데 ~이 소요

//p is parameter with type p: Process[Task, Pixel] 

def printToImage(img: BufferedImage)(pixel: Pixel): Unit = { 
    img.setRGB(pixel.x, pixel.y, 1, 1, Array(pixel.rgb), 0, 0) 
} 
val image = getBlankImage(2000, 4000) 
val result = p.runLog.run 
result.foreach(printToImage(image)) 

싱크없이 버전 : 여기

내 코드의 관련 부분입니다 . 나는 그 중요한 차이 때문에 여기에서 완전히 혼란 스럽다.

답변

7

두 번째 경우에는 각 픽셀에 대해 Task를 할당하고 printToImage를 직접 호출하는 대신 Task를 통해 작업을 수행합니다. 호출 체인에서 훨씬 더 많은 단계가 있습니다.

우리는 scalaz-stream을 많이 사용합니다.하지만이 유형의 문제를 해결하기 위해서는 과잉이라고 생각합니다. 프로세스/채널/싱크 내부에서 실행되는 코드는 간단한 변수 할당/업데이트보다 훨씬 복잡해야합니다.

우리는 Sinks를 사용하여 스트림에서 데이터베이스 (Cassandra)로 데이터를 쓰고 일괄 처리를 사용합니다. 개별 행을 작성하는 데 높은 오버 헤드가 발생합니다. 프로세스/싱크는 매우 편리한 추상화이지만 더 높은 수준의 워크 플로입니다. for-loop를 작성하기가 쉬운 경우 for-loop를 작성하는 것이 좋습니다.

+0

감사합니다. 그 이상한 행동을 설명합니다. 나는 이것이 경량의 공정이라고 생각했다. – user2963977