web-dev-qa-db-fra.com

À quelle vitesse peut aller Go?

Go est l'une des rares langues qui sont censées fonctionner "près du métal", i. e. il est compilé, typé statiquement et exécute le code nativement, sans VM. Cela devrait lui donner un avantage de vitesse par rapport à Java, C # et similaires. Il semble cependant que ce soit derrière Java (voir Programming Language Shootout )

Je suppose que les compilateurs moins matures sont extrêmement responsables de cela, mais y a-t-il d'autres raisons? Y a-t-il quelque chose d'inhérent à la conception de Go qui l'empêcherait de fonctionner plus rapidement que, disons, Java? J'ai une vue très peu sophistiquée des modèles d'exécution, mais il semble qu'au moins en principe, il devrait pouvoir fonctionner plus rapidement que Java, grâce à l'exécution de code natif.

39
Greg Slodkowicz

En termes de conception de langage, rien ne devrait vraiment ralentir Go que Java en général. En fait, cela vous donne plus de contrôle sur la disposition de la mémoire de vos structures de données, donc pour de nombreuses tâches courantes, cela devrait être un peu plus rapide. Cependant, le compilateur Go principal actuel, le planificateur, le garbage collector, la bibliothèque regexp et bien d'autres choses ne sont pas particulièrement optimisés. Cela s'améliore régulièrement, mais l'accent semble être mis sur l'utilité, la simplicité et la rapidité de gagner des repères microbiens.

Dans le cas-test lié, Go perd gros à Java sur l'arborescence binaire et le test d'expression régulière. Ce sont des tests du système de gestion de la mémoire et de la bibliothèque d'expressions rationnelles respectivement. La gestion de la mémoire de Go pourrait être plus rapide et s'améliorera certainement avec le temps, et la bibliothèque d'expressions régulières standard actuelle est un espace réservé pour une bien meilleure implémentation qui sera bientôt disponible. Donc, perdre sur ces deux n'est pas surprenant, et dans un avenir proche, la marge devrait être plus étroite.

Pour le benchmark k-nucléotides, il est quelque peu difficile à comparer car le code Java semble utiliser un algorithme différent. Le code Go bénéficiera certainement des améliorations du compilateur, du planificateur et de l'allocateur à venir, même écrites, mais quelqu'un devrait réécrire le code Go pour faire quelque chose de plus intelligent si nous voulions comparer plus précisément.

Java gagne dans le benchmark mandelbrot car il s'agit uniquement d'arithmétique à virgule flottante et de boucles, et c'est un excellent endroit pour la JVM pour générer un très bon code machine et hisser des choses lors de l'exécution. Go, en comparaison, a un compilateur assez simple qui ne hisse pas, ne déroule pas ou ne génère pas de code machine vraiment serré actuellement, il n'est donc pas surprenant qu'il perde. Cependant, il faut garder à l'esprit que le timing Java ne compte pas le temps de démarrage de la JVM ou le nombre de fois qu'il doit être exécuté pour que la JVM le JIT correctement. Pour les programmes de longue durée, cela n'est pas pertinent, mais cela compte dans certains cas.

Comme pour le reste des benchmarks, Java et Go sont essentiellement au coude à coude, avec Go prenant beaucoup moins de mémoire et dans la plupart des cas moins de code. Ainsi, alors que Go est plus lent que Java dans un certain nombre de ces tests, Java est assez rapide, Go se débrouille assez bien en comparaison, et Go deviendra probablement beaucoup plus rapide dans un avenir proche .

J'ai hâte de voir quand gccgo (un compilateur Go qui utilise le code gcc) est arrivé à maturité; cela devrait rendre Go plus ou moins conforme à C pour de nombreux types de code, ce qui sera intéressant.

46
Kyle C
  1. Sans même dire quels problèmes ont été résolus, l'ensemble de la référence est inutile.
  2. JVM et CLR utilisent tous les deux des JIT pour produire du code machine. Il n'y a aucune raison que cela soit plus lent. Cela vous coûte juste des âges pour démarrer.
  3. Go a été conçu pour construire rapidement. Vous n'avez pas des tonnes d'optimisations de temps de compilation et de démarrage. Go compile sa propre bibliothèque standard au moment où une application Java a démarré.

Go pourrait-il être plus rapide à l'exécution? Oui. Est-ce que Go sera plus rapide à l'exécution? Je ne sais pas. Peut-être que les constructeurs du compilateur ajouteront une optimisation facultative au prix du temps de compilation. Mais je ne pense pas qu'ils s'intéressent beaucoup à cela. Ils travaillent chez Google.
Ce qu'ils veulent, c'est un langage qui permette un développement rapide et qui fonctionne bien dans ce qu'ils font. Enfer, même si cette référence était crédible, cela signifierait qu'ils sont moitié moins rapides que C et 14 fois plus rapides que Python. C'est plus que suffisant.
Le matériel est bon marché, le code est cher. Le code a tendance à devenir plus gros et plus lent lorsque vous investissez de l'argent, le matériel devient moins cher et plus petit. Vous voulez un langage, qui ne nécessite pas 4 frameworks et 2000 classes pour accomplir quoi que ce soit d'utile.
Il n'y a rien d'inhérent à la conception de Go, qui le rend lent. Cependant, il y a quelque chose d'inhérent aux concepteurs de Go, qui le rend plus lent que Assembly: le bon sens.

22
back2dos

J'ai aussi remarqué que Go était particulièrement lent dans le benchmark regex-dna. Russ Cox a expliqué pourquoi Go n'était pas aussi performant dans cette référence particulière . La raison en est que le package regexp de Go utilise un algorithme de correspondance différent qui fonctionne mal dans ce benchmark particulier mais qui pourrait être d'une amplitude plus rapide dans d'autres repères. Ruby, Python et d'autres langages de script utilisent également une implémentation C d'un autre algorithme de correspondance d'expressions régulières.

Enfin, le jeu Computer Language Benchmarks est constitué de micro-benchmarks qui pourraient ne pas refléter avec précision de nombreuses caractéristiques des langues mesurées et même servir de médiateur. impressions erronées. Ce document de recherche, récemment publié par Google donne un aperçu plus précis de plusieurs caractéristiques linguistiques de Go, Scala, Java et C++ - en particulier la partie "V. Analyse des performances". Au final, Go est presque aussi gourmand en mémoire que Java (81% de la mémoire Java) et consomme même 170% autant de mémoire que Scala (impossible de trouver dans le document si la consommation de mémoire de JVM était prise en compte).

Mais encore une fois, Go est jeune et toujours en développement (changements d'API)! De nombreuses améliorations arrivent bientôt.

10
Alex

Go est plus rapide que Python et un peu plus lent que Java. Mon expérience approximative a montré que Go était beaucoup (1-2 ordres de grandeur) plus rapide que Python, et environ 10-20% plus lent que Java. Cependant, Go est légèrement plus rapide que Java s'il est utilisé avec un quad-core (x64). Go est également beaucoup plus efficace en termes de mémoire RAM.

Je voudrais ajouter quelques points sur le potentiel de performance de Go par rapport à Java et Python. Go permet plus de choses que C fait, ce qui permet constamment à C de surpasser la plupart des autres langages. Les échecs de cache sont assez important à éviter pour le code haute performance. La réduction des échecs de cache nécessite de contrôler la disposition de la mémoire de vos structures de données. Go vous permet de le faire. Java ne le fait pas, ce qui rend plus difficile d'éviter la fracturation de la mémoire et cache.

En ce moment Java s'exécute généralement plus vite que Go, car Java garbage collector est beaucoup plus sophistiqué. Bien qu'il n'y ait aucune raison pour que le garbage collector Go ne puisse pas être La génération de code est aussi probablement bien meilleure pour Java pour le moment. Go a beaucoup de potentiel à améliorer, par exemple avec le support des instructions vectorielles, etc.

Je pense donc que ce n'est qu'une question de temps avant que Go ne dépasse Java. Bien que comme avec n'importe quel code de langue, il ne sera probablement pas plus rapide automatiquement en étant écrit en Go. Vous devez utiliser les installations que la langue vous offre. Je dirais que Go donne simplement plus de possibilités pour régler votre code.

Quoi qu'il en soit, ce n'est qu'une expérience de développeur.

1
Milo Banks