Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
3年前关闭。
Improve this question
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选择下一个Job来执行它。在JVM中,就这些术语而言,没有智能的工作切换。
因此,Go可以廉价地更改当前正在运行的作业。 Go只需更改几个注册表 https://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ。但是有人说,JVM可以使用线程堆栈而不是寄存器。因此根本没有保存和加载寄存器。
kotlin协程和goroutine的第二个区别是协程的类型。 Kotlin协程是无堆栈协程。 Goroutines是堆积如山的协程。 Kotlin协程的所有状态都存储在Kotlin上下文中,该上下文存储在堆中。 Goroutines状态存储在寄存器和线程堆栈中。
我想知道,哪些协程(goroutines和kotlin协程)在IO绑定(bind)任务中更快? CPU绑定(bind)的任务?那内存消耗呢? 与Go goroutines相比,每个简单实例的Kotlin协程需要更少的内存。在Kotlin中,一个简单的协程仅占用几十个字节的堆内存,而Go goroutine从4KiB的堆栈空间开始。这意味着,如果您计划拥有数以百万计的协程,那么Kotlin中的协程可能会比Go更胜一筹。它还使Kotlin协程更适合于生命周期很短的小型任务,例如生成器和惰性序列。 Kotlin协程可以到达任何堆栈深度,但是每次调用暂停功能都会在堆中为其堆栈分配对象。 Kotlin协程中的调用栈当前被实现为堆对象的链接列表。相反,Go中的goroutines使用线性堆栈空间。这使得在Go中深层堆栈的悬挂更加有效。因此,如果您正在编写的代码在堆栈的最深处暂停,您可能会发现goroutine对您而言更有效。 有效的异步IO是一个非常多维的设计问题。一种对一种应用程序有效的方法可能不会给另一种应用程序带来最佳性能。 Kotlin协程中的所有IO操作均由用Kotlin或Java编写的库实现。 Kotlin代码可使用多种IO库。在Go中,异步IO由Go运行时使用通用Go代码不可用的原语实现。如果Go实现IO操作的方法非常适合您的应用程序,那么您可能会发现它与Go运行时的紧密集成为您提供了优势。另一方面,在Kotlin中,您可以找到一个库或自己编写一个库,该库以最适合您的应用程序的方式实现异步IO。 Go运行时可以完全控制在物理OS线程上调度goroutine执行的时间。这种方法的优点是您不必全盘考虑。使用Kotlin协程,您可以对协程的执行环境进行细粒度的控制。这很容易出错(例如,您可能会简单地创建太多不同的线程池,并在它们之间进行上下文切换时浪费您的CPU时间)。但是,它使您能够为应用程序微调线程分配和上下文切换。例如,在Kotlin中,很容易在单个OS线程(或线程池)中执行整个应用程序或其代码子集,从而完全避免仅通过为此编写适当的代码就可以在OS线程之间切换上下文。
想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
3年前关闭。
Improve this question
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选择下一个Job来执行它。在JVM中,就这些术语而言,没有智能的工作切换。
因此,Go可以廉价地更改当前正在运行的作业。 Go只需更改几个注册表 https://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ。但是有人说,JVM可以使用线程堆栈而不是寄存器。因此根本没有保存和加载寄存器。
kotlin协程和goroutine的第二个区别是协程的类型。 Kotlin协程是无堆栈协程。 Goroutines是堆积如山的协程。 Kotlin协程的所有状态都存储在Kotlin上下文中,该上下文存储在堆中。 Goroutines状态存储在寄存器和线程堆栈中。
我想知道,哪些协程(goroutines和kotlin协程)在IO绑定(bind)任务中更快? CPU绑定(bind)的任务?那内存消耗呢?
最佳答案
Kotlin中的协程与Go中的goroutines的实现方式不同,因此“协程”的“更快”取决于您要解决的问题和所编写的代码类型。
通常,很难预先告诉您哪种方法可以更好地解决您遇到的问题。您必须为您的特定工作负载运行基准才能弄清楚。但是,以下是主要区别的一般摘要,应为您提供一些指导。
关于go - 哪些协程(goroutines和kotlin协程)比较快? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46864623/
10-15 05:22