115 votes

Pourquoi est-il si lent aller langue ?

Comme nous pouvons le voir à partir de La Langue de l'Ordinateur de Repères de Jeu:

  • aller est en moyenne de 10x plus lent que le C
  • aller est 3x plus lent que Java !?

Comment cela peut-il être, en gardant à l'esprit que d'aller compilateur génère du code natif pour l'exécution?
Immatures de compilateurs pour aller? Ou un problème intrinsèque à l'aller de la langue?

EDIT:
La plupart des réponses refuser intrinsèque de la lenteur de la Aller languge, affirmant que le problème réside dans immatures compilateurs.
Donc j'ai fait quelques tests pour calculer les nombres de Fibonacci: Itératif de l'algorithme s'exécute en Aller (freebsd,6g) avec l' same de la vitesse comme en C (O3). Le terne récursive tourne en Aller 2 times plus lente que dans C (avec-O3 option;- O0 - même). Mais je n'ai pas vu 10x automne comme dans les cas-tests de Jeu.

Merci beaucoup pour les réponses!

104voto

Steve Jessop Points 166970

La 6g et 8g compilateurs ne sont pas particulièrement l'optimisation, de sorte que le code qu'ils produisent n'est pas particulièrement rapide.

Ils sont conçus pour s'exécuter rapidement eux-mêmes et de produire du code qui est OK (il y a un peu d'optimisation). gccgo utilise GCC existants optimisation passe, et pourrait fournir un plus pointful comparaison avec le C, mais gccgo n'est pas complet encore.

Indice de référence les chiffres sont presque entièrement sur la qualité de la mise en œuvre. Ils n'ont pas une quantité énorme de faire avec la langue en tant que telle, sauf dans la mesure où la mise en œuvre passe exécution de soutenir des fonctionnalités de langage que l'indice de référence n'a pas vraiment besoin. Dans la plupart des langages compilés suffisamment habile compilateur pourrait, en théorie, d'en extraire ce qui n'est pas nécessaire, mais il arrive un moment où vous êtes le gréement de la démo, depuis très peu de vrais utilisateurs de la langue d'écrire des programmes qui n'utilisent pas cette fonctionnalité. Bouger les choses à l'écart sans les enlever entièrement (par exemple, la prévision d'appels virtuel destinations dans JIT-compilé en Java) commence à devenir difficile.

FWIW, mes propres très trivial test avec Aller quand j'ai été jeter un coup d'oeil (une boucle de entier plus, essentiellement), gccgo code produit vers la fin rapide de la gamme entre gcc -O0 et gcc -O2 pour l'équivalent C. Aller n'est pas généralement lente, mais les compilateurs ne pas tout faire, et pourtant. Pas étonnant pour un langage de 10 minutes.

53voto

peterSO Points 25725

Dans la prochaine version de l' Aller FAQ, quelque chose de similaire à la suivante apparaît.

Performance

Pourquoi Aller mal fonctionner sur le benchmark X?

L'un de Aller objectifs de conception du est à l'approche de la performance de C pour programmes comparables, mais sur certains repères ça fait assez mal, dont plusieurs test/banc. L' plus lent dépendent les bibliothèques pour qui les versions de rendement comparables sont pas disponible en Aller. Par exemple, pidigits dépend d'un multi-précision paquet de maths, et la C versions, contrairement à l'Aller, utiliser les BPF (ce qui est écrit en assembleur optimisé). Repères qui dépendent des expressions régulières (regex de l'adn, par exemple) sont essentiellement comparant Go pis-aller regexp paquet à maturité, très optimisé expression régulière bibliothèques comme PCRE.

Indice de référence des jeux sont gagnés par une vaste tuning et les versions de la plupart des les critères de référence ont besoin d'attention. Si vous mesure comparable C et programmes (reverse-le complément est un exemple), vous verrez les deux langues sont beaucoup plus proche en performances brutes que ce suite.

Il y a encore place à l'amélioration. Les compilateurs sont bonne, mais pourrait être mieux, de nombreuses bibliothèques ont besoin majeur la performance et la poubelle collecteur n'est pas assez rapide encore (même si elle l'était, en prenant soin de ne pas générer inutile poubelle ont un effet énorme).

Et voici quelques détails supplémentaires sur L'Ordinateur de Repères de Jeu à partir d'une récente liste de diffusion thread.

La collecte des ordures et de la performance dans gccgo (1)

La collecte des ordures et de la performance dans gccgo (2)

Il est important de noter que l'Ordinateur Repères Jeu est juste un jeu. Les gens avec de l'expérience dans la mesure de la performance et planification de la capacité soigneusement match comme avec comme plus réaliste et actuel, des charges de travail; ils ne jouent pas à des jeux.

35voto

jdi Points 38029

Ma réponse n'est pas aussi technique que tous les autres, mais je pense que c'est toujours d'actualité. J'ai vu les mêmes repères sur l'Ordinateur Repères de Jeu quand j'ai décidé de commencer à apprendre à Aller. Mais honnêtement, je pense que tous ces benchmarks synthétiques sont inutiles en termes de décider si l'Aller est assez rapide pour vous.

J'avais écrit un message serveur en Python à l'aide de la Tornade+TornadIO+ZMQ récemment, et pour mon premier Aller de projet, j'ai décidé de réécrire le serveur en Aller. Jusqu'à présent, avoir obtenu le serveur les mêmes fonctionnalités que la version de Python, mes tests sont en me montrant environ 4,7 x augmentation de la vitesse dans le cadre du programme Go. Rappelez-vous, j'ai seulement été le codage en Aller pour peut-être une semaine, et j'ai été codage en Python pour les plus de 5 ans.

Allez va seulement pour obtenir plus rapidement qu'ils continuent à travailler, et je pense que vraiment il s'agit de la façon dont elle se produit dans une application réelle et pas minuscules peu de calcul de points de référence. Pour moi, Aller apparemment abouti à accroître l'efficience du programme que ce que j'ai pu produire en Python. C'est mon point de vue sur la réponse à cette question.

4voto

twotwotwo Points 2187

Dans le cas d'un couple de points de référence, il est facile de pointer à l'exécution ou à la bibliothèque différences qui provoquent le ralentissement.

Le binaire-arbres de référence est décrite comme "une adaptation d'un indice de référence pour le test GC." Go GC n'est pas actuellement où Java ou C#sont, et les charges de travail avec des tonnes de pointeur contenant des objets et beaucoup de mémoire de la pression, elle montre. Si c'était un problème dans un vivre rendez-vous de l'application, vous mettriez votre propre pool d'objets/liste libre de réutiliser les objets de ce type [edit: les gens de chez CloudFlare, qui utilisent Aller, juste arrivé de poster sur la façon de le faire]. C'est une approche pour contrôler les GC coûts utilisés dans GC avais langues en général, mais que la page liée notes c'est exclus par les règles pour cette référence.

Le pidigits benchmark utilise Go grand-nombre-bibliothèque de mathématiques, qui est plus lent que les choses comme C GMP ou probablement Java des bibliothèques. Si les performances de votre application est limitée par bignum vitesse (peut être un facteur clé publique de chiffrement et de maths/sci apps; moins de, disons, Web app backends), vous voulez appeler à la bibliothèque C de Go ou ou tout simplement utiliser une langue différente.

De nombreuses autres différences susceptibles de descendre à moins optimisé la génération de code, que l'on a accepté la réponse dit.

Si vous souhaitez faire votre choix avec une perspective plus large que celle de repères, bien sûr. Beaucoup de Go utilisateurs, y compris moi-même, semblent venir de travailler avec des langages de script, et semblent aimer l'inférence de type, de la simultanéité des outils et rapide de la compilation. D'autre part, de la relative immaturité de l'écosystème (par rapport à Java, C langues, ou encore Python) est un gros inconvénient, sans doute plus important que le nombre de référence. Semble valoir la peine d'entrer dans si vous avez de l'intérêt, en tout cas.

1voto

Curtis Paul Points 1

Il s'agit de combien de temps il faut pour coder quelque chose et le peu de travail est nécessaire pour obtenir les meilleures performances de ce qui est développé. Tout le reste est juste un ringard poursuite qui n'a pas beaucoup de pertinence dans les affaires.......ce genre de chose.

Aller fait le développement de services plus faciles à soutenir. Java...quelle que soit sa capacité technique...cauchemar à l'appui....

J'ai écrit quelques Golang programmes....rapide comme de la merde par une oie......et si mon travail était à croquer grave mathématiques tout au long de la journée...je ne pense pas que je voudrais utiliser Java ou Aller...je voudrais utiliser un langage conçu pour ce genre de chose.

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