Котлин параллельных вычислений большого массива - PullRequest
1 голос
/ 07 июня 2019

У меня большой массив, и мне нужно вычислить результат на основе каждого элемента этого массива. Процессор моего компьютера имеет 2 ядра. Я сравнил разные способы достижения параллельного выполнения в Kotlin.

Я написал простой пример, чтобы проиллюстрировать это. Первый путь - параллельный поток Java, второй - простая карта Котлина, третий - сопрограммная версия карты.

fun p() = runBlocking {
    val num = (0 until 1_000_000).toList()
    println(measureTimeMillis {
        num.stream().parallel().map { it * 2 }.collect(Collectors.toList())
    })
    println(measureTimeMillis {
        num.map { it * 2 }
    })
    println(measureTimeMillis {
        num.pmap { it * 2 }
    })
}

suspend fun <A, B> Iterable<A>.pmap(f: suspend (A) -> B): List<B> = coroutineScope {
    map { async { f(it) } }.map { it.await() }
}

Выход (в мс.):

152
64
1620

Почему версия pmap такая медленная? Как улучшить код?

...