Kotlin corutines - это сахар для конечного автомата и некоторый бегун (например, по умолчанию ForkJoinPool). https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#implementation-details
Другими словами, пока нет исполняемых команд runtime в java/kotlin (но это может измениться с помощью http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html). Kotlin coroutine - это просто последовательность задач, которые выполняются один за другим. Каждая задача может быть выполнена в любом потоке из пула потоков.
Go runtime поддерживает "сопрограммы". Но goroutines - не настоящие сопрограммы. Goroutines не позволяет задавать точки урожая в программе. Кроме того, Go не позволяет установить собственный пул потоков. Вы можете установить только размер потоков в пуле по умолчанию.
Первое различие между kotlin coroutines и goroutines - Go runtime управляет тем, что coroutine работает в данный момент. Когда gotoutine блокируются при некоторой операции ввода-вывода (или примитивах синхронизации), Go выбирает следующий Job для его выполнения. В JVM нет интеллектуального переключения работы в таких условиях.
Из-за этого Go может дешево изменить текущую работу. Go должен только изменить несколько реестров https://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ. Но некоторые люди говорят, что JVM может использовать стек потоков вместо использования регистров. Таким образом, нет никакой экономии и загрузки регистров.
Второе различие между kotlin coroutines и goroutines - это тип сопрограмм. Kotlin coroutines - это стекированные сопрограммы. Горотины - это многоуровневые сопрограммы. Все состояния сопрограмм Kotlin хранятся в контексте Котлина, который хранится в куче. Состояние Goroutines хранится в регистрах и стеках потоков.
Я хочу знать, какие сопрограммы (goroutines и kotlin coroutines) быстрее выполняются в задачах, связанных с IO? Задачи, связанные с процессором? Как насчет потребления памяти?