Какие из корутинов (goroutines и kotlin coroutines) быстрее? [закрытый]

Kotlin corutines-сахар для конечного автомата и некоторого бегуна задач (например, ForkJoinPool по умолчанию). https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#implementation-details

другими словами, в Java/Kotlin runtime еще нет coroutines времени выполнения (но это может измениться с помощьюhttp://cr.openjdk.java.net / ~rpressler/loom/Loom-Proposal.html). Kotlin coroutine - это просто последовательность задач, которая выполняются один за другим. Каждая задача может быть выполнена в любом потоке из пула потоков.

GO runtime поддерживает "coroutines". Но горутины не реальная сопрограммы. Goroutines не позволяет устанавливать точки доходности в программе. Кроме того, Go не позволяет устанавливать пользовательский пул потоков. Вы можете установить только размер потоков в пуле по умолчанию.

первая разница между kotlin coroutines и goroutines-Go runtime управляет тем, какой coroutine работает в данный момент. Когда goroutine заблокирован в некоторых операциях ввода-вывода (или примитивах синхронизации), перейдите к следующему заданию для его выполнения. В JVM нет интеллектуального переключения заданий в таких терминах.

из-за этого Go может дешево изменить текущее задание. Go должен только изменить несколько реестров https://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ - ... Но некоторые люди говорят, что JVM может использовать стек потоков вместо использования регистров. Так что спасения нет и загрузка регистров вообще.

второе отличие между Котлин сопрограммы и горутины-это типа сопрограммы. Котлин сопрограммы-это stackless сопрограммы. Горутины являются stackful сопрограммы. Все состояние Котлин сопрограммы хранятся в контексте Котлин, который хранится в куче. Состояние Goroutines хранится в регистрах и стеке потоков.

Я хочу знать, какие корутины (goroutines и Kotlin coroutines) быстрее в задачах, связанных с IO? Задачи, связанные с CPU? Что о потребление памяти?

1 ответов


Coroutines в Kotlin реализованы по-другому, чем goroutines в Go, поэтому какой из них "быстрее" зависит от проблемы, которую вы решаете, и вида кода, который вы пишете.

В общем, очень трудно заранее сказать, какой из них будет работать лучше для проблемы, которую вы имеете под рукой. Вам нужно запустить тесты для ваших конкретных рабочих нагрузок, чтобы понять это. Однако вот общее резюме ключевых различий, которые должны дать вам некоторые руководство.

  • Kotlin coroutines требуют меньше памяти на простой экземпляр, чем Go goroutines. Простая корутина в Котлине занимает всего несколько десятков байтов памяти кучи, в то время как Go goroutine начинается с 4kib пространства стека. Это означает, что если вы планируете иметь буквально миллионы сопрограммы, то сопрограммы в Котлин может дать вам преимущество против пойти. Это также делает Kotlin coroutines более подходящими для очень недолговечных и небольших задач, таких как генераторы и ленивые последовательности.

  • Kotlin coroutines может перейти на любую глубину стека, однако каждый вызов функции приостановки выделяет объект в куче для его стека. В настоящее время стек вызова в Котлин сопрограммы реализуется как связанный список объектов кучи. Напротив, goroutines в Go используют линейное пространство стека. Это делает подвес на глубоких стогах более эффективным в Go. Таким образом, если код, который вы пишете, приостанавливается очень глубоко в стеке, вы можете обнаружить, что goroutines больше эффективно для вас.

  • эффективный асинхронный ввод-вывод является очень многомерной проблемой проектирования. Подход, эффективный для одного вида приложений, может не обеспечить наилучшую производительность для другого. Все операции ввода-вывода в Kotlin coroutines реализуются библиотеками, написанными на Kotlin или Java. Существует огромное разнообразие библиотек ввода-вывода, доступных для кода Kotlin. В Go асинхронный ввод-вывод реализуется GO runtime с использованием примитивов, недоступных для общего Go код. Если подход Go к реализации операций ввода-вывода хорошо подходит для вашего приложения, вы можете обнаружить, что его тесная интеграция с GO runtime дает вам преимущество. С другой стороны, в Kotlin вы можете найти библиотеку или написать ее самостоятельно, которая реализует асинхронный ввод-вывод Таким образом, который лучше всего подходит для вашего приложения.

  • GO runtime полностью контролирует планирование выполнения goroutines в потоках физической ОС. Преимущество такого подхода заключается в том, что тебе не нужно думать обо всем этом. С Kotlin coroutines у вас есть мелкозернистый контроль над средой выполнения ваших coroutines. Это подвержено ошибкам (например, вы можете просто создать слишком много разных пулов потоков и тратить свое время процессора на переключение контекста между ними). Однако это дает вам возможность точно настроить распределение потоков и контекстные переключатели для вашего приложения. Например, в Kotlin легко выполнить все ваше приложение или подмножество его кода в одной ОС поток (или пул потоков), чтобы полностью избежать переключения контекстов между потоками ОС, просто написав соответствующий код для этого.