Sauf à utiliser un small object allocator. C'est pour ça que je dis que généralement, les benchs qui donnent le GC gagnant le font sur des codes qui, justement, nécessiteraient l'emploi d'un tel allocateur.Normalement, le GC demande au système des pools mémoire et les gère lui-même. Il ne fera donc pas plusieurs appels à free comme tu sembles le penser.
De plus, si le GC est bien foutu, il inclue des optimisation pour la désallocation de masse, ce que tu ne peux pas faire via des appels successifs à free.
Par contre, Frank a effectivement raison sur le point de la fragmentation mémoire (encore que les os récents (au moins les kernels linux récents) supportant la défragmentation de la mémoire, je serais curieux de voir ce qu'il en est maintenant).
J'ai pas trouvé wccpp1. Par contre, wccpp2 est une vaste plaisanterie : il parcourt deux fois le buffer, 1 fois pour compter les lignes, une autre fois pour compter les mots. C'est fou, c'est plus long que le programme D qui ne fait qu'un seul parcours .Tu as les codes sur la page. Il n'y a franchement pas d'aberrations dans el code C++ (il y en a deux versions).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Program Compile Compile Time Run Run Time D wc gdc -O2 -frelease -o wc wc.d 0.326 wc alice30.txt > /dev/null 0.041 D wc dmd wc -O -release 0.235 wc alice30.txt > /dev/null 0.041 C++ wccpp1 g++ -O2 -o wccpp1 wccpp1.cc 2.874 wccpp1 alice30.txt > /dev/null 0.086 C++ wccpp2 g++ -O2 -o wccpp2 wccpp2.cc 2.886 wccpp2 alice30.txt > /dev/null 0.095
L'option de compile release en D permet d'obtenir un exécutable non managé (pas de runtime check). On peut donc se prendre un seg fault dans les dents mais on tourne à pleine vitesse.
Partager