首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >科特林: coroutineScope比GlobalScope慢

科特林: coroutineScope比GlobalScope慢
EN

Stack Overflow用户
提问于 2019-04-05 08:42:03
回答 1查看 2.9K关注 0票数 9

我正在学习协同,我遇到了以下令人惊讶的行为(对我来说)。我想要一张平行地图。我认为有4种解决办法:

  1. 只有map,没有并行性
  2. pmap,来自这里
  3. 修改第2项:我删除了coroutineScope并使用了GlobalScope
  4. Java的parallelStream

守则:

代码语言:javascript
复制
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()) }
}

产出(不包括总数):

代码语言:javascript
复制
No parallelism  time: 0.85726849
CoroutineScope  time: 0.827426385
GlobalScope     time: 0.145788785
ParallelStream  time: 0.161423263

正如您所看到的,在coroutineScope中几乎没有增益,而对于GlobalScope,它的工作速度与parallelStream一样快。原因何在?我能有一个解决方案,它具有coroutineScope的所有优点,具有相同的速度增益吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-05 09:02:54

范围只是间接地涉及到您所观察到的差异。

GlobalScope是一个单例,它定义了自己的调度程序,即Dispatchers.Default。它由线程池支持。

coroutineScope没有定义自己的dispatcher,因此您可以从调用方继承它,在本例中是由runBlocking创建的。它使用调用的单个线程。

如果您将coroutineScope替换为withContext(Dispatchers.Default),您将得到相同的时间。实际上,您应该这样写这个(而不是GlobalScope),以便在一些并发任务可能失败的情况下获得正常的行为。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55531464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档