2014-10-14 17 views
6

Mam dziwne spostrzeżenie na temat zlewów ze strumieniem scalaz. Pracują wolno. Czy ktoś wie, dlaczego tak się dzieje? Czy jest jakiś sposób na poprawę wydajności?Jak poprawić wydajność kodu za pomocą Sink?

tutaj są odpowiednie części mojego kodu: wersja bez zlewu

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

ten trwa ~ 7s do wykonania

wersji z umywalką

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

ten trwa 33 sekund, aby wykonać . Jestem całkowicie zdezorientowany z powodu tej znaczącej różnicy.

Odpowiedz

7

W drugim przypadku przydzielacie zadanie dla każdego piksela, a zamiast bezpośrednio wywoływać printToImage, robicie to przez Zadanie, a jest to o wiele więcej kroków w łańcuchu wywołań.

Bardzo często używamy strumienia scalaz, ale jestem przekonany, że to przesada, aby użyć go do tego typu problemów. Kod działający w procesie/kanale/umyśle powinien być znacznie bardziej skomplikowany niż proste przypisanie/aktualizacja zmiennych.

Używamy zlewów do zapisywania danych ze strumienia do baz danych (Cassandra) i używamy dozowania, to do wysokiego narzutu, aby pisać poszczególne wiersze. Proces/Zlewozmywaki to bardzo wygodna abstrakcja, ale w przypadku bardziej zaawansowanych obiegów pracy. Gdy łatwo jest napisać pętlę for, sugerowałbym napisanie pętli for.

+0

Dzięki, że wyjaśnia to dziwne zachowanie. Myślałem, że to raczej lekki proces. – user2963977

Powiązane problemy