8 parallel-processing performance coroutine kotlin kotlin-coroutines
我正在学习协程,我遇到了以下令人惊讶的(对我而言)行为。我想要一张平行地图。我考虑了4个解决方案:
map,没有并行性pmap从这里。coroutineScope并使用GlobalScope.parallelStream.编码:
import kotlinx.coroutines.*
import kotlin.streams.toList
import kotlin.system.measureNanoTime
inline fun printTime(msg: String, f: () -> Unit) =
    println("${msg.padEnd(15)} time: ${measureNanoTime(f) / 1e9}")
suspend fun <T, U> List<T>.pmap(f: (T) -> U) = coroutineScope {
    map { async { f(it) } }.map { it.await() }
}
suspend fun <T, U> List<T>.pmapGlob(f: (T) -> U) =
    map { GlobalScope.async { f(it) } }.map { it.await() }
fun eval(i: Int) = (0 .. i).sumBy { it * it }
fun main() = runBlocking {
    val list = (0..200).map { it * it * it }
    printTime("No parallelism") { println(list.map(::eval).sum()) }
    printTime("CoroutineScope") { println(list.pmap(::eval).sum()) }
    printTime("GlobalScope") { println(list.pmapGlob(::eval).sum()) }
    printTime("ParallelStream") { println(list.parallelStream().map(::eval).toList().sum()) }
}
输出(无总和):
No parallelism  time: 0.85726849
CoroutineScope  time: 0.827426385
GlobalScope     time: 0.145788785
ParallelStream  time: 0.161423263
如您所见,coroutineScope几乎没有增益,而GlobalScope它的运行速度与parallelStream. 是什么原因?我可以有一个具有coroutineScope相同速度增益的所有优点的解决方案吗?
范围仅间接涉及您观察到的差异。
GlobalScope是一个单例,它定义了自己的调度程序,即Dispatchers.Default. 它由线程池支持。
coroutineScope没有定义自己的调度程序,所以你从调用者那里继承它,在这种情况下是由runBlocking. 它使用它被调用的单线程。
如果您替换coroutineScope为withContext(Dispatchers.Default),您将获得相同的时间。这实际上是您应该如何编写 this (而不是GlobalScope),以便在面对某些并发任务可能失败时获得理智的行为。
| 归档时间: | 
 | 
| 查看次数: | 2273 次 | 
| 最近记录: |