首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪个协程(goroutines和kotlin协程)更快?

哪个协程(goroutines和kotlin协程)更快?
EN

Stack Overflow用户
提问于 2017-10-21 23:01:40
回答 1查看 11K关注 0票数 44

Kotlin corutines对于有限状态机和一些任务运行器(例如,默认ForkJoinPool)来说是糖。https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#implementation-details

换句话说,java/kotlin运行时中还没有运行时协程(但这可能会随着http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html的变化而改变)。Kotlin协程只是一个接一个地执行的任务的顺序。每个任务都可以在线程池中的任何线程中执行。

Go运行时支持“协程”。但是goroutines并不是真正的协程。Goroutines不允许在程序中设置屈服点。另外,Go不允许设置自定义线程池。您可以仅设置默认池中线程的大小。

kotlin协程和goroutines之间的第一个区别是Go运行时管理此时正在运行的协程。当goroutine在某些IO操作(或同步原语)上被阻塞时,Go选择next Job来执行它。在JVM中,没有这样的智能工作切换。

正因为如此,Go可以廉价地更改当前正在运行的作业。Go只需更改几个注册表https://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ。但是有些人说,JVM可以使用线程堆栈而不是寄存器。所以根本不需要保存和加载寄存器。

kotlin协程和goroutines之间的第二个区别是协程的类型。Kotlin协程是无栈协程。Goroutines是堆栈协程。Kotlin协程的所有状态都存储在Kotlin上下文中,而上下文则存储在堆中。Goroutines状态存储在寄存器和线程堆栈中。

我想知道,在IO绑定的任务中,哪些协程(goroutines和kotlin协程)更快?CPU受限的任务?内存消耗情况如何?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-22 00:09:08

Kotlin中的协程是以不同于Go中的goroutines的方式实现的,因此哪个“更快”取决于您正在解决的问题和您正在编写的代码的类型。

一般来说,很难提前判断出哪种方法能更好地解决你手头的问题。您必须针对特定的工作负载运行基准测试才能找出答案。然而,这里是关键差异的一般总结,应该会给你一些指导。

与Go goroutines相比,

  • Kotlin协程对每个简单实例所需的内存更少。Kotlin中的简单协程只占用几十个字节的堆内存,而Go goroutine从4KiB的堆栈空间开始。这意味着,如果你计划拥有数百万的协程,那么Kotlin中的协程可能会给你带来相对于Go的优势。它还使得Kotlin协程更适合于非常短暂和小的任务,如生成器和惰性sequences.
  • Kotlin协程可以到达任何堆栈深度,但是每次调用挂起函数都会在堆中为其堆栈分配对象。Kotlin协程中的调用堆栈目前被实现为堆对象的链表。相比之下,Go中的goroutines使用线性堆栈空间。这使得在Go中在深层堆栈上的暂停更有效率。因此,如果你正在编写的代码在堆栈的深层挂起,你可能会发现goroutines对你来说更有效。
  • 高效的异步IO是一个非常多维的设计问题。一种对一种应用程序有效的方法可能不会给另一种应用程序带来最佳性能。Kotlin协程中的所有IO操作都是由用Kotlin或Java编写的库实现的。Kotlin代码有各种各样的IO库可用。在Go中,异步IO是由Go运行时使用通用Go代码不可用的原语实现的。如果实现IO操作Go方法非常适合您的应用程序,那么您可能会发现它与Go运行时的紧密集成为您提供了一个优势。另一方面,在Kotlin中,您可以找到一个库,也可以自己编写一个库,它以最适合您的application.
  • Go运行时的方式实现异步IO完全控制在物理OS线程上调度goroutines的执行。这种方法的优点是,您不必考虑所有问题。使用Kotlin协程,您可以对协程的执行环境进行细粒度的控制。这很容易出错(例如,你可能会创建太多不同的线程池,浪费CPU时间在它们之间的上下文切换上)。但是,它使您能够微调应用程序的线程分配和上下文切换。例如,在Kotlin中,很容易在单个OS线程(或线程池)中执行整个应用程序或其代码的子集,以完全避免在OS线程之间切换上下文,只需为此编写适当的代码。
票数 108
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46864623

复制
相关文章

相似问题

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