J'apprends Go et j'ai commencé à utiliser le package math/big
pour gérer les entiers de longueur arbitraire.Gérer les grands nombres avec des performances de type GMP dans Go
J'ai écrit ce programme qui calcule la n-ième nombre de Fibonacci: (supprimé les import
s):
func main() {
imax, _ := strconv.Atoi(os.Args[1])
var a, b, c big.Int
a.SetUint64(0)
b.SetUint64(1)
for i := 0; i < imax; i++ {
c.Set(&b)
b.Add(&b, &a)
a.Set(&c)
}
fmt.Println(a.String())
}
Voici le code pour le programme C:
int main(int argc, char** argv)
{
int imax = atoi(argv[1]);
mpz_t a, b, c;
mpz_inits(a, b, c, NULL);
mpz_set_ui(a, 0);
mpz_set_ui(b, 1);
int i = 0;
for (i = 0; i < imax; i++) {
mpz_swap(a, b);
mpz_add(b, a, b);
}
char* astr = NULL;
astr = mpz_get_str(NULL, 10, a);
printf("%s\n", astr);
return EXIT_SUCCESS;
}
Les Computes du programme Go le terme 100 000 en 0,1 seconde (moyenne), tandis que l'équivalent en C, utilisant le GMP lib, ne s'exécute qu'en 0,04 seconde. C'est deux fois plus lent.
Y a-t-il un moyen d'obtenir la même performance dans mon programme Go?
Je vote pour clore cette question hors-sujet car il s'agit d'une demande de révision de code. – Olaf
Comment est-ce une demande de révision de code? Je ne veux pas optimiser * ce * programme spécifiquement, mais apprendre un moyen d'obtenir les mêmes perfs dans les deux langues. J'ai essayé de rendre les deux programmes aussi similaires que possible pour obtenir un point de référence non biaisé. Une réponse pourrait être une autre arithmétique arbitraire Go bibliothèque par exemple. – Arno
Si vous voulez comparer les opérations, vous devez configurer un benchmark reproductible. Nous ne savons pas comment vous compilez et exécutez votre code. Sur mon système, le code go calcule 10000 en ~ 55ms. – JimB