MagicBuzz a écrit :
Le GC est un "tiers de confiance".
Le dev n'a pas à se préoccuper de ce qu'il fait ni de comment il fonctionne. A partir de là, il n'y a pas de "garantie".
C'est évidement une philosophie totalement différente du C où on peut aller jusqu'à contrôler quels registres vont être utilisés pour chaque instruction.
Dans l'exemple que j'ai cité, le GC peut tout à fait décider d'allouer 2 espaces mémoire pour deux instances de la fonction "prout()", puis alterner leur réutilisation.
Tout comme il peut aussi décider que ça va être plus coûteux de réutiliser cet espace que de le réallouer à chaque fois, avant de tout désallouer à la fin.
Je comprends que cela puisse être choquant quand on est habitué à tout maîtriser.
Cependant les résultats sont là : autant pour une toute petit appli (calcul du MD5 d'un fichier par exemple) en C on aura certainement des performances infiniment suppérieures au C#, même si c'est MagicBuzz qui a écrit le programme en C, autant dans d'autres cas, le C# sera bien plus rapide qu'un programme C écrit proprement (c'est à dire sans utiliser des optimisation de la mort, genre mise en global de variables internes à des fonctions).
On ne peut pas tirer de cas général, d'autant que le GC va s'adapter à la machine sur laquelle il tourne : sur un PC qui a 4 Go de mémoire libre, le GC va se contenter d'allouer tant qu'il peut de la place pour de nouvelles variables, puis tout désallouer d'un coup quand il aura fini, histoire d'être le plus rapide possible, autant pour un PC très limité en mémoire, le GC va faire de la réutilisation intensive, malgré le coût potentiel, afin d'économiser de la mémoire.
Ca fait partie notamment des fonctionnalités du JITC (just-in-time-compilation) de .NET 2.0 (recompilation systématique du programme lorsqu'il est lancé pour la première fois). En C, ça correspondrait à une compilation conditionnelle qui est effectuée automatiquement en fonction de la machine sur laquelle est lancé le programme.
Le GC apporte en fait un réel gain lorsqu'on travaille avec des objets volumineux dont une partie de l'état peut changer : il est capable de recycler la partie qui n'a pas changé, et n'a donc qu'à réinitiliser que la partie qui a changé.
En C ça peut rapidement devenir la prise de tête pour refaire ça "à la main".
|