2014-10-14 9 views
6

Ich habe seltsame Beobachtung über Scala-Streams sinkt. Sie arbeiten langsam. Weiß jemand, warum ist das? Und gibt es eine Möglichkeit, die Leistung zu verbessern?Wie verbessert man die Leistung von Code mit Sink?

hier sind relevante Teile meines Code: Version ohne Waschbecken

//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)) 

diese ~ 7s

Version mit Spüle

//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 

dieses 33 Sekunden dauert auszuführen nimmt auszuführen . Ich bin hier total verwirrt wegen dieses signifikanten Unterschieds.

Antwort

7

Im zweiten Fall ordnen Sie Task für jedes Pixel zu, und anstatt printToImage direkt aufzurufen, tun Sie es über Task, und es sind viel mehr Schritte in einer Aufrufkette.

Wir verwenden scalaz-stream sehr, aber ich glaube fest daran, dass es übertrieben ist, es für diese Art von Problemen zu verwenden. Code, der innerhalb von Process/Channel/Sink läuft, sollte viel komplizierter sein als die einfache Zuweisung/Aktualisierung von Variablen.

Wir verwenden Sinks zum Schreiben von Daten aus dem Stream in Datenbanken (Cassandra) und wir verwenden Batching, es ist zu viel Aufwand, um einzelne Zeilen zu schreiben. Process/Sinks ist super bequeme Abstraktion, aber für mehr High-Level-Workflows. Wenn es einfach ist, for-loop zu schreiben, würde ich vorschlagen, for-loop zu schreiben.

+0

Danke, das erklärt dieses seltsame Verhalten. Ich dachte, das ist ein eher leichter Prozess. – user2963977

Verwandte Themen