23 votes

Qui de coroutines (goroutines et kotlin coroutines) sont les plus rapides?

Kotlin corutines est le sucre pour machine à états finis et certains task runner (par exemple, par défaut ForkJoinPool). https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#implementation-details

En d'autres termes, il n'y a pas de runtime coroutines en java/kotlin runtime encore (mais cela peut changer avec http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html ). Kotlin coroutine est juste séquentielle des tâches qui sont exécutées une par une. Chaque tâche peut être exécutée dans un thread du pool de threads.

Aller runtime prend en charge "coroutines". Mais goroutines n'est pas le réel coroutines. Goroutines ne permet pas de définir le rendement de points dans le programme. Aussi, Allez ne permet pas de définir un pool de threads. Vous pouvez définir la taille de threads dans le pool par défaut.

Une première différence entre kotlin coroutines et goroutines est d'Aller runtime qui gère coroutine est en cours d'exécution en ce moment. Lorsque goroutine sont bloqués à un certain opération e / s (ou primitives de synchronisation), Aller à des choix de la prochaine Tâche à exécuter. Dans la JVM n'est pas intellectuelle de l'emploi de commutation dans de telles conditions.

De ce fait, peut Aller à moindre coût de changement de tâche en cours d'exécution. Aller a plus qu'à changer quelques registres https://groups.google.com/forum/#!msg/golang-noix/j51G7ieoKh4/wxNaKkFEfvcJ. Mais certaines personnes disent, que la JVM pouvez utiliser la pile des threads au lieu de l'utilisation des registres. Donc, il n'y a pas de sauvegarde et de chargement des registres à tous.

La deuxième différence entre les kotlin coroutines et goroutines est le type de coroutines. Kotlin coroutines est stackless coroutines. Goroutines sont stackful coroutines. Tout état de Kotlin coroutines sont stockés dans Kotlin contexte, qui est stocké en tas. Goroutines état est stocké dans les registres et la pile de thread.

Je veux savoir, ce qui coroutines (goroutines et kotlin coroutines) sont plus rapides dans IO lié tâches? CPU des tâches? Ce sujet de la consommation de mémoire?

60voto

Roman Elizarov Points 8871

Coroutines dans Kotlin sont mis en œuvre de manière différente des goroutines en Aller, alors, qui est "plus rapide" dépend du problème à résoudre et le type de code que vous écrivez.

En général, il est très difficile de dire à l'avance qui va fonctionnent mieux pour un problème que vous avez à portée de main. Vous devez exécuter des repères pour vos charges de travail pour le comprendre. Cependant, voici un résumé général des principales différences qui devrait vous donner quelques conseils.

  • Kotlin coroutines nécessitent moins de mémoire par simple exemple que d'Aller goroutines. Un simple coroutine dans Kotlin n'est que de quelques dizaines d'octets de mémoire dans la mémoire, tandis qu'un Aller goroutine commence avec 4KiB d'espace de pile. Cela signifie, que si vous prévoyez d'avoir littéralement des millions de coroutines, puis coroutines dans Kotlin peut vous donner un avantage contre Aller. Il rend également Kotlin coroutines mieux adapté pour de très courte durée et de petites tâches, comme les générateurs et paresseux séquences.

  • Kotlin coroutines pouvez aller à n'importe quelle pile de profondeur, cependant chaque appel de la suspension de fonction alloue l'objet dans le tas pour sa pile. Une invocation de la pile dans Kotlin coroutines est actuellement mis en œuvre comme une liste chaînée des tas d'objets. En revanche, les goroutines en Aller linéaire d'espace de pile. Cela fait de la suspension de deep stacks plus efficace en Aller. Donc, si le code que vous écrivez suspend très profond en bas de la pile, vous pouvez trouver que les goroutines sont plus efficaces pour vous.

  • Efficace asynchrone IO est un très multidimensionnelle du problème de conception. Une approche efficace pour un type d'application peut ne pas donner les meilleures performances à un autre. Toutes les opérations d'e / s dans Kotlin coroutines sont mis en œuvre par des bibliothèques écrites en Kotlin ou Java. Il ya une énorme variété de IO bibliothèques à la disposition des Kotlin code. Allez asynchrone IO est mis en œuvre par Aller de l'exécution à l'aide de primitives qui ne sont pas disponibles à l'Aller code. Si Aller de l'approche à mettre en œuvre des opérations d'e / s est bien adapté à votre application, alors vous pourriez trouver que son intégration étroite avec le runtime vous donne un avantage. De l'autre côté, dans Kotlin, vous pouvez trouver une bibliothèque ou écrivez-en un vous-même, qui met en œuvre asynchrone IO dans une manière qui est le mieux adapté à votre application.

  • Aller runtime prend le contrôle complet de planification des goroutines d'exécution sur la physique de l'OS threads. L'avantage de cette approche est que vous n'avez pas à penser à propos de tout cela. Avec Kotlin coroutines vous disposez d'un contrôle précis sur l'environnement d'exécution de votre coroutines. C'est sujette à des erreurs (par exemple, vous pouvez simplement créer trop de thread différent-les piscines et les déchets de votre temps CPU sur le changement de contexte entre eux). Cependant, il vous donne la capacité à affiner votre fil d'allocation et les commutations de contexte de votre application. Par exemple, dans Kotlin, il est facile pour l'exécution de votre application dans son ensemble ou un sous-ensemble de son code dans un système d'exploitation unique thread (ou le pool de threads) d'éviter complètement de commutation de contextes entre les OS des fils juste par l'écriture d'un code approprié pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X