Juste comme ca, je viens de regarder en diagonal le code de fibo et ackermann, car les resultats me paraissaient etrange. En faite ton code ne permet pas du tout, en C++, au compilo d'optimiser la tail recursivite. Il vaut mieux ecrire fibo comme ca a priori :
static const unsigned long optfib(const unsigned long n, const unsigned long sum) {
if (n < 2)
return 1 + sum;
else
return optfib(n-2, optfib(n-1, sum));
}
static inline const unsigned long fib (const unsigned long n)
{
return optfib (n, 0);
}
(Un "objdump -d" sur le binaire te montrera qu'il n'y a plus que un seul vrai appel de fonction, les autres ayant ete remplace par des sauts). Pour Ackermann, ce serait plutot comme ca :
const int Ack(const int M, const int N)
{
if (!M)
return N + 1;
else
if (!N)
return Ack (M - 1, 1);
else
return Ack (M - 1, Ack (M, N - 1));
}
Dans cette version de Ack, il ne restera aussi que un seul vrai call.
Sinon je ne connais pas le Java suffisament bien, mais j'avais cru comprendre qu'il y avait un garbage collector, donc tester l'allocation dans objinst ne me parait pas tres convaincant, car pour le C++, c'est un delete pour chaque new, tandis que pour Java, il va pouvoir mutualiser ce genre d'operation. Dans un gros programme en C ou C++ on gagne toujours enormement a gerer correctement sa memoire (sans directement utiliser malloc/free ou new/delete). Donc ce critere me parait au mieux biaise.
Enfin pour wc, le dico doit etre un peu petit parce que les temps sont tous tres proches et la moindre variation dans la charge de la machine pourrait avoir un effet sur les resultats.
[^] # Re: Je me disais aussi...
Posté par cedric . En réponse à la dépêche OpenOffice.org version 2.0 et Java. Évalué à 2.
static const unsigned long optfib(const unsigned long n, const unsigned long sum) {
if (n < 2)
return 1 + sum;
else
return optfib(n-2, optfib(n-1, sum));
}
static inline const unsigned long fib (const unsigned long n)
{
return optfib (n, 0);
}
(Un "objdump -d" sur le binaire te montrera qu'il n'y a plus que un seul vrai appel de fonction, les autres ayant ete remplace par des sauts). Pour Ackermann, ce serait plutot comme ca :
const int Ack(const int M, const int N)
{
if (!M)
return N + 1;
else
if (!N)
return Ack (M - 1, 1);
else
return Ack (M - 1, Ack (M, N - 1));
}
Dans cette version de Ack, il ne restera aussi que un seul vrai call.
Sinon je ne connais pas le Java suffisament bien, mais j'avais cru comprendre qu'il y avait un garbage collector, donc tester l'allocation dans objinst ne me parait pas tres convaincant, car pour le C++, c'est un delete pour chaque new, tandis que pour Java, il va pouvoir mutualiser ce genre d'operation. Dans un gros programme en C ou C++ on gagne toujours enormement a gerer correctement sa memoire (sans directement utiliser malloc/free ou new/delete). Donc ce critere me parait au mieux biaise.
Enfin pour wc, le dico doit etre un peu petit parce que les temps sont tous tres proches et la moindre variation dans la charge de la machine pourrait avoir un effet sur les resultats.