大阵列的科特林并行计算(Kotlin parallel computation of large a

2019-09-27 01:40发布

我有一个大阵,需要在此基础上阵列的每个项目计算结果。 我的电脑的处理器有2个内核。 我比较不同的方式来实现科特林并行执行。

我写了简单的例子来说明这一点。 第一种方式是爪哇并行流,第二个是纯科特林地图,第三是地图的协程版本。

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版本是如此之慢? 如何提高代码?

文章来源: Kotlin parallel computation of large array