Ich lerne Go und ich begann mit dem math/big
-Paket, um mit arbitrary-length Integer umzugehen.Umgang mit großen Zahlen mit GMP-Stil Leistung in Go
Ich schrieb dieses Programm, das die n-te Fibonacci-Zahl berechnet: (entfernt die import
e):
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())
}
Hier ist der Code für das C-Programm:
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;
}
Das Programm Go berechnet der Ausdruck 100.000 in 0,1 Sekunden (Durchschnitt), während das C-Äquivalent unter Verwendung der GMP-Bibliothek nur in 0,04 Sekunden läuft. Das ist zweimal langsamer.
Gibt es eine Möglichkeit, die gleiche Leistung in meinem Go-Programm zu erhalten?
Ich stimme für das Schließen dieser Frage als Off-Topic, da dies eine Anforderung für eine Codeüberprüfung ist. – Olaf
Wie ist es eine Anfrage für Code Review? Ich möchte dieses * Programm nicht speziell optimieren, sondern einen Weg finden, die gleichen Fähigkeiten in den beiden Sprachen zu erhalten. Ich habe versucht, die beiden Programme so ähnlich wie möglich zu machen, um eine nicht voreingenommene Benchmark zu erhalten. Eine Antwort könnte beispielsweise eine andere arithmetische Go-Bibliothek mit beliebiger Genauigkeit sein. – Arno
Wenn Sie Operationen vergleichen möchten, müssen Sie einen reproduzierbaren Benchmark einrichten. Wir wissen nicht, wie Sie Ihren Code kompilieren und ausführen. Auf meinem System berechnet der Go-Code 10000 in ~ 55ms. – JimB