2014-10-14 11 views
6

Ho una strana osservazione sui sink dei flussi di scalaz. Stanno lavorando lentamente. Qualcuno sa perché è così? E c'è un modo per migliorare le prestazioni?Come migliorare le prestazioni del codice con Sink?

qui sono parti rilevanti del mio codice: versione senza dissipatore

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

questo richiede ~ 7s di eseguire la versione

con lavello

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

questo prende 33 secondi per eseguire . Sono totalmente confuso qui a causa di questa differenza significativa.

risposta

7

Nel secondo caso si assegna un'attività per ciascun pixel e invece di chiamare direttamente printToImage lo si fa tramite l'attività, e si tratta di molti più passaggi in una catena di chiamate.

Usiamo scalaz-stream molto, ma credo fermamente che sia eccessivo usare questo tipo di problemi. Il codice in esecuzione in Process/Channel/Sink dovrebbe essere molto più complicato di una semplice assegnazione/aggiornamento delle variabili.

Usiamo i sink per scrivere i dati dallo stream nei database (Cassandra) e usiamo il batching, è un overhead elevato per scrivere singole righe. Process/Sinks è un'astrazione super conveniente, ma per flussi di lavoro di alto livello. Quando è facile scrivere for-loop, suggerirei di scrivere for-loop.

+0

Grazie, questo spiega un comportamento strano. Ho pensato che fosse un processo piuttosto leggero. – user2963977

Problemi correlati