lib - ¿Cuáles de los coroutines(goroutines y kotlin coroutines) son más rápidos?
kotlin coroutines version (1)
Coroutines en Kotlin se implementan de manera diferente a los goroutines en Go, de modo que el que sea "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. Tiene que ejecutar puntos de referencia para sus cargas de trabajo particulares para resolverlo. Sin embargo, aquí hay un resumen general de las diferencias clave que deberían darle alguna orientación.
Koutlin coroutines requiere menos memoria por instancia simple que Go Goroutines. Una simple guía en Kotlin ocupa solo unas pocas docenas de bytes de memoria de almacenamiento dinámico, mientras que una Go Goroutine comienza con 4KiB de espacio de pila. Esto significa que si planeas tener literalmente millones de coroutines, entonces las coroutinas en Kotlin podrían darte una ventaja frente a Go. También hace que Kotlin coroutines sea más adecuado para tareas de corta duración y pequeñas como generadores y secuencias perezosas.
Las rutinas de Kotlin pueden ir a cualquier profundidad de pila, sin embargo, cada invocación de la función de suspensión asigna el objeto en el montón para su pila. Una pila de invocación en Kotlin coroutines se implementa actualmente como una lista enlazada de objetos de pila. En contraste, los goroutines en Go usan espacio de pila lineal. Esto hace que la suspensión en pilas profundas sea más eficiente en Go. Por lo tanto, si el código que estás escribiendo se suspende muy en el fondo de la pila, es posible que los goroutines sean más eficientes para ti.
E / S asíncrona eficiente es un problema de diseño muy multidimensional. Un enfoque que sea eficiente para un tipo de aplicación puede no dar el mejor rendimiento a otro. Todas las operaciones IO en Kotlin coroutines son implementadas por bibliotecas escritas en Kotlin o Java. Hay una gran variedad de bibliotecas IO disponibles para el código Kotlin. En Go, la E / S asíncrona se implementa en tiempo de ejecución de Go utilizando primitivas que no están disponibles para el código de Go general. Si el enfoque de Go para implementar las operaciones de IO se adapta bien a su aplicación, entonces es posible que su estrecha integración con el tiempo de ejecución de Go le proporcione una ventaja. Por otro lado, en Kotlin puede encontrar una biblioteca o escribir una que implemente IO asíncrona de la manera que mejor se adapte a su aplicación.
Go Runtime toma el control completo de la programación de ejecuciones de goroutines en los hilos físicos del sistema operativo. La ventaja de este enfoque es que no tienes que pensar en todo. Con Kotlin coroutines usted tiene un control preciso sobre el entorno de ejecución de sus coroutines. Esto es propenso a errores (por ejemplo, puede crear demasiados grupos de subprocesos diferentes y perder el tiempo de CPU en el cambio de contexto entre ellos). Sin embargo, le brinda la capacidad de ajustar la asignación de subprocesos y los cambios de contexto para su aplicación. Por ejemplo, en Kotlin es fácil ejecutar toda la aplicación o un subconjunto de su código en un solo subproceso del sistema operativo (o grupo de subprocesos) para evitar por completo el cambio de contextos entre los hilos del sistema operativo simplemente escribiendo un código apropiado para eso.
Kotlin corutines es el azúcar para la máquina de estados finitos y algún corredor de tareas (por ejemplo, el valor predeterminado de ForkJoinPool). https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#implementation-details
En otras palabras, todavía no hay corroutines en tiempo de ejecución en el tiempo 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 por una. Cada tarea se puede ejecutar en cualquier subproceso del grupo de subprocesos.
Go Runtime soporta "coroutines". Pero los goroutines no son los verdaderos coroutines. Goroutines no permite establecer puntos de rendimiento en el programa. Además, Go no permite establecer un grupo de subprocesos personalizados. Puede establecer solo el tamaño de los hilos en el grupo predeterminado.
La primera diferencia entre kotlin coroutines y goroutines es que Go Runtime gestiona qué coroutine se está ejecutando en este momento. Cuando las goroutinas se bloquean en alguna operación de E / S (o primitivas de sincronización), seleccione el siguiente trabajo para ejecutarlo. En JVM no hay cambio de trabajo intelectual en tales términos.
Debido a esto, Go puede cambiar de forma económica el trabajo que se está ejecutando. Go solo tiene que cambiar algunos registros . Pero algunas personas dicen que JVM puede usar la pila de hilos en lugar de usar registros. Así que no hay ningún guardado y carga de registros en absoluto.
La segunda diferencia entre kotlin coroutines y goroutines es el tipo de coroutines. Kotlin coroutines es coroutines sin pila. Los goroutines son coroutines apilables. Todo el estado de Kotlin coroutines se almacena en el contexto de Kotlin, que se almacena en el montón. El estado de Goroutines se almacena en registros y en la pila de hilos.
Quiero saber qué coroutines (goroutines y kotlin coroutines) son más rápidos en las tareas relacionadas con IO. Tareas vinculadas a la CPU? ¿Qué pasa con el consumo de memoria?