J'ai lu dans de nombreux endroits (diable, je l'ai même écrit moi-même) que la collecte des ordures pourrait (théoriquement) être plus rapide que la gestion manuelle de la mémoire.
Cependant, montrer est beaucoup plus difficile à trouver qu'à raconter.
Je n'ai jamais vu de morceau de code qui démontre cet effet en action.
Quelqu'un a-t-il (ou sait-il où je peux trouver) du code qui démontre cet avantage de performance?
memory
garbage-collection
Mehrdad
la source
la source
Réponses:
Voir http://blogs.msdn.com/b/ricom/archive/2005/05/10/416151.aspx et suivez tous les liens pour voir Rico Mariani vs Raymond Chen (deux programmeurs très compétents chez Microsoft) se battre . Raymond améliorerait le non managé, Rico réagirait en optimisant la même chose dans les managés.
Avec un effort d'optimisation pratiquement nul, les versions gérées ont démarré plusieurs fois plus rapidement que le manuel. Finalement, le manuel a battu le managé, mais seulement en optimisant à un niveau auquel la plupart des programmeurs ne voudraient pas aller. Dans toutes les versions, l'utilisation de la mémoire du manuel était nettement meilleure que celle gérée.
la source
swap
) n'est pas si difficile, et vous y arriverait probablement assez facilement en termes de performances ...La règle d'or est qu'il n'y a pas de repas gratuits.
GC élimine le casse-tête de la gestion manuelle de la mémoire et réduit la probabilité de faire des erreurs. Dans certaines situations, une stratégie GC particulière est la solution optimale au problème, auquel cas vous ne paierez aucune pénalité pour son utilisation. Mais il y en a d'autres où d'autres solutions seront plus rapides. Comme vous pouvez toujours simuler des abstractions plus élevées à partir d'un niveau inférieur, mais pas l'inverse, vous pouvez effectivement prouver qu'il n'y a aucun moyen que des abstractions plus élevées puissent être plus rapides que les plus basses dans le cas général.
GC est un cas particulier de gestion manuelle de la mémoire
Obtenir de meilleures performances manuellement peut demander beaucoup de travail ou davantage d'erreurs, mais c'est une autre histoire.
la source
Il est facile de construire une situation artificielle où GC est infiniment plus efficace que les méthodes manuelles - arrangez-vous simplement pour qu'il n'y ait qu'une seule "racine" pour le garbage collector, et que tout soit ordures, donc l'étape GC est immédiatement terminée.
Si vous y réfléchissez, c'est le modèle utilisé lors de la collecte de la mémoire allouée à un processus. Le processus meurt, tout sa mémoire est des ordures, nous avons terminé. Même en termes pratiques, un processus qui démarre, s'exécute et s'éteint sans laisser de trace peut être plus efficace qu'un processus qui démarre et s'exécute pour toujours.
Pour les programmes pratiques, écrits dans des langues avec garbage collection, l'avantage du garbage collection n'est pas la rapidité mais la justesse et la simplicité.
la source
abort()
en C ++ avant la fin du programme. C'est une comparaison dénuée de sens; vous n'êtes même pas en train de ramasser les ordures, vous laissez simplement la mémoire fuir. Vous ne pouvez pas dire que la collecte des ordures est plus rapide (ou plus lente) si vous ne commencez pas par la collecte des ordures ...Il faut considérer que GC n'est pas seulement une stratégie de gestion de la mémoire; il impose également des exigences sur la conception complète de l'environnement de langage et d'exécution, ce qui impose des coûts (et des avantages). Par exemple, un langage qui prend en charge GC doit être compilé sous une forme où les pointeurs ne peuvent pas être cachés au garbage collector, et généralement où ils ne peuvent être construits que par des primitives système soigneusement gérées. Une autre considération est la difficulté de maintenir les garanties de temps de réponse, car le GC impose certaines étapes qui doivent pouvoir se terminer.
Par conséquent, si vous avez une langue qui est garbage collection et comparez la vitesse avec la mémoire gérée manuellement dans le même système, vous devez toujours payer les frais généraux pour prendre en charge le garbage collection même si vous ne l'utilisez pas.
la source
Plus vite est douteux. Cependant, il peut être ultra-rapide, imperceptible ou plus rapide s'il est pris en charge par le matériel. Il y a longtemps, il y avait des modèles comme celui-là pour les machines LISP. L'un a intégré le GC dans le sous-système de mémoire du matériel en tant que tel que le processeur principal ne savait pas qu'il était là. Comme beaucoup de conceptions ultérieures, le GC a fonctionné simultanément avec le processeur principal avec peu ou pas besoin de pauses. Une conception plus moderne est celle des machines Azul Systems Vega 3 qui exécutent le code Java beaucoup plus rapidement que les machines virtuelles Java utilisant des processeurs spécialement conçus et un GC sans pause. Utilisez-les sur Google si vous voulez savoir à quelle vitesse GC (ou Java) peut être.
la source
J'ai fait pas mal de travail à ce sujet et en ai décrit une partie ici . J'ai comparé le GC Boehm en C ++, en allouant en utilisant
malloc
mais pas en libérant, en allouant et en libérant en utilisantfree
un GC de région de marque personnalisé écrit en C ++ tout contre le GC stock OCaml exécutant un solveur n-queens basé sur une liste. Le GC d'OCaml était plus rapide dans tous les cas. Les programmes C ++ et OCaml ont été délibérément écrits pour effectuer les mêmes allocations dans le même ordre.Vous pouvez bien sûr réécrire les programmes pour résoudre le problème en utilisant uniquement des entiers 64 bits et aucune allocation. Bien que plus rapide, cela irait à l'encontre de l'objectif de l'exercice (qui était de prédire les performances d'un nouvel algorithme GC sur lequel je travaillais en utilisant un prototype construit en C ++).
J'ai passé de nombreuses années dans l'industrie à porter du vrai code C ++ vers des langages gérés. Dans presque tous les cas, j'ai observé des améliorations de performances substantielles, dont beaucoup étaient probablement dues à la gestion manuelle de la mémoire par GC. La limite pratique n'est pas ce qui peut être accompli dans une microbenchmark mais ce qui peut être accompli avant une date limite et les langages basés sur GC offrent des améliorations de productivité si énormes que je n'ai jamais regardé en arrière. J'utilise toujours C et C ++ sur des appareils embarqués (microcontrôleurs) mais même cela change maintenant.
la source
List.filter
comme le fait C ++. Mais, oui, vous avez certainement tout à fait raison de dire que certaines opérations RC peuvent être éludées. Cependant, le plus gros problème que je vois dans la nature est que les gens n'ont pas le temps d'effectuer de telles optimisations à la main sur de grandes bases de codes industriels.shared_ptr
pour corriger des bugs de concurrence. Le code est beaucoup plus lent mais bon, maintenant ça marche.Un tel exemple a nécessairement un mauvais schéma d'allocation de mémoire manuelle.
Supposons le meilleur ramasse-miettes
GC
. Il a en interne des méthodes pour allouer de la mémoire, déterminer quelle mémoire peut être libérée et des méthodes pour enfin la libérer. Ensemble, cela prend moins de temps que tousGC
; un certain temps est consacré aux autres méthodes duGC
.Considérons maintenant un allocateur manuel qui utilise le même mécanisme d'allocation que
GC
, et dont l'free()
appel met simplement de côté la mémoire à libérer par la même méthode queGC
. Il n'a pas de phase de numérisation, ni aucune autre méthode. Cela prend nécessairement moins de temps.la source
free
peut également collecter des lots. (Et bien sûr, supprimer tous les éléments répondant à un critère est toujours O (N), ne serait-ce qu'en raison de la liste elle-même)free
pourrait fonctionner dans un mode de collecte par lots si chaque élément de mémoire était associé à un indicateur, bien que le GC puisse toujours sortir en tête dans certaines situations. Si l'on a M références qui identifient L éléments distincts sur un ensemble de N choses, le temps de supprimer chaque référence à laquelle aucune référence n'existe et de consolider le reste est O (M) plutôt que O (N). Si l'on dispose de M d'espace supplémentaire disponible, la constante de mise à l'échelle peut être assez petite. De plus, la compactification dans un système GC sans balayage nécessite ...