2014-10-14 5 views
6

У меня странное наблюдение о раковинах скаляз-потоков. Они работают медленно. Кто-нибудь знает, почему? И есть ли способ улучшить производительность?Как повысить производительность кода с помощью раковины?

здесь соответствующие части моего кода: версия без раковины

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

это занимает ~ 7s выполнить

версия с раковиной

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

это один занимает 33 секунд, чтобы выполнить , Из-за этой существенной разницы я совершенно смущен.

ответ

7

Во втором случае вы назначаете задачу для каждого пикселя, а вместо прямого вызова printToImage вы выполняете ее через Task, и это намного больше шагов в цепочке вызовов.

Мы используем stream-stream много, но я твердо верю, что это излишне использовать его для подобных проблем. Код, выполняющийся внутри Process/Channel/Sink, должен намного сложнее, чем простое назначение/обновление переменной.

Мы используем Sinks для записи данных из потока в базы данных (Cassandra), и мы используем пакетную обработку, это означает, что для записи отдельных строк требуется высокая накладная. Process/Sinks - это супер удобная абстракция, но для более высоких рабочих процессов. Когда это легко написать for-loop, я бы предложил написать for-loop.

+0

Спасибо, что объясняет это странное поведение. Я думал, что это довольно легкий процесс. – user2963977

Смежные вопросы