¿Cuál de las corutinas (goroutines y corotines de kotlin) son más rápidas?

Kotlin corutines es azúcar para máquinas de estados finitos y algunos cornetworkingores de tareas (por ejemplo, ForkJoinPool por defecto). https://github.com/Kotlin/kotlincoroutines/blob/master/kotlin-coroutines-informal.md#implementation-details

En otras palabras, todavía no hay corrutinas en time de ejecución en el time de ejecución de java / kotlin (pero esto puede cambiar con http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html ). Kotlin coroutine es solo una secuencia de tareas, que se ejecutan una a una. Cada tarea se puede ejecutar en cualquier hilo desde el grupo de subprocesss.

Go runtime admite "corutinas". Pero los goroutines no son las corutinas reales. Goroutines no permite establecer puntos de performance en el progtwig. Además, Go no permite establecer un grupo de subprocesss personalizado. Puede establecer solo el tamaño de los hilos en el grupo pnetworkingeterminado.

La primera diferencia entre kotlin coroutines y goroutines es Go runtime administra qué coroutine se está ejecutando en este momento. Cuando la function de rutina está bloqueada en alguna operación de E / S (o primitivas de synchronization), select las siguientes opciones de Trabajo para ejecutarla. En JVM no hay cambio de trabajo intelectual en tales términos.

Debido a esto, Go puede cambiar de forma económica el trabajo actualmente en ejecución. Ir solo tiene que cambiar algunos loggings https://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ . Pero algunas personas dicen que JVM puede usar una stack de hilos en lugar de usar loggings. Por lo tanto, no hay guardado y carga de loggings en absoluto.

La segunda diferencia entre corotines kotlin y goroutines es el tipo de corutinas. Kotlin coroutines es corotines sin astackmiento. Los goroutines son corotines astackdas. Todos los corotines del estado de Kotlin se almacenan en el context de Kotlin, que se almacena en el montón. El estado de Goroutines se almacena en loggings y en la stack de subprocesss.

Quiero saber qué corotines (corotines y corotines de kotlin) son más rápidas en tareas enlazadas a IO. Tareas vinculadas a la CPU? ¿Qué hay del consumo de memory?

Las corotinas en Kotlin se implementan de forma diferente que las rutinas en Go, por lo tanto, cuál es "más rápido" depende del problema que está resolviendo y del tipo de código que está escribiendo.

En general, es muy difícil saber de antemano cuál va a funcionar mejor para un problema que tiene a mano. Debes ejecutar testings comparativas para tus cargas de trabajo particulares para resolverlo. Sin embargo, aquí hay un resumen general de las diferencias key que deberían brindarle alguna orientación.

  • Las corotinas de Kotlin requieren less memory por instancia simple que Go goroutines. Una coroutine simple en Kotlin ocupa solo unas pocas docenas de bytes de memory de montón, mientras que una goroutine de Go comienza con 4KiB de espacio de stack. Significa que si planea tener literalmente millones de corrutinas, entonces las corutinas en Kotlin podrían darle una ventaja frente a Go. También hace que las corotinas de Kotlin sean más adecuadas para tareas muy breves y de vida corta como generadores y secuencias perezosas.

  • Las corotines de Kotlin pueden ir a cualquier profundidad de stack, sin embargo, cada invocación de la function de suspensión asigna objects en el montón para su stack. Una stack de invocación en corotines de Kotlin se implementa actualmente como una list vinculada de objects de montón. En contraste, los goroutines en Go usan espacio de stack lineal. Esto hace que la suspensión en stacks profundos sea más eficiente en Go. Por lo tanto, si el código que está escribiendo suspende muy profundamente en la stack, es posible que descubra que los goroutines son más eficientes para usted.

  • E / S asíncrona eficiente es un problema de layout muy multidimensional. Un enfoque que es eficiente para un tipo de aplicación puede no dar el mejor performance a otro. Todas las operaciones de IO en corotines de Kotlin se implementan mediante bibliotecas escritas en Kotlin o Java. Existe una gran variedad de bibliotecas IO disponibles para el código Kotlin. En Go asynchronous, IO es implementado por Go runtime utilizando primitivas que no están disponibles para el código Go general. Si el enfoque Go para implementar operaciones IO se adapta bien a su aplicación, entonces es posible que su estrecha integración con Go runtime le brinde una ventaja. Por otro lado, en Kotlin puede encontrar una biblioteca o escribir una usted mismo que implementa IO asíncrona de la manera más adecuada para su aplicación.

  • El time de ejecución de Go toma el control completo de la ejecución de la progtwigción de los goroutines en los hilos físicos del sistema operativo. La ventaja de este enfoque es que no tiene que pensar en todo. Con las corotinas de Kotlin, tiene un control detallado sobre el entorno de ejecución de sus corrutinas. Esto es propenso a errores (por ejemplo, puede crear demasiados grupos de subprocesss diferentes y perder el time de su CPU en el cambio de context entre ellos). Sin embargo, le da la capacidad de ajustar su asignación de hilos y los interruptores de context para su aplicación. Por ejemplo, en Kotlin es fácil ejecutar toda su aplicación o un subset de su código en una sola cadena de sistema operativo (o set de subprocesss) para evitar por completo el cambio de contexts entre los subprocesss del sistema operativo simplemente escribiendo un código apropiado para eso.

  • ¿Cuál es la mejor manera de esperar hasta que el actor se detenga en kotlinx.coroutines 0.20?
  • ¿Hay alguna forma de get el comportamiento de FixedTreadPool usando corutinas?
  • Cómo volver a intentar el retroceso exponencial en corotines de kotlin
  • ¿Pueden `SendChannel.offer`,` CompletableDefernetworking.complete` y similares llamarse corutinas externas?
  • Cómo usar código que se basa en ThreadLocal con corotines de Kotlin
  • ¿Cómo se ejecuta el método de suspensión a través de la reflexión?
  • Unidad probando una corotina de Kotlin con retraso
  • Kotlin coroutines usa produce y mockito para burlarse del trabajo de producción
  • ¿Cómo se organizan múltiples corrutines y bloques de expectativas en una testing de Kotlin Spek?
  • Kotlin coroutines unit testing usando mockito
  • ¿Cómo puedo conectar un productor a un actor?