Я изучаю Go, и я начал использовать пакет math/big
для работы с целым числом произвольной длины.Работа с большими номерами с характеристиками в стиле GMP в Go
Я написал эту программу, которая вычисляет п-го числа Фибоначчи: (удалены в import
ы):
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())
}
Вот код программы 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;
}
Программа рассчитывает Go термин 100 000 в 0,1 секунду (средний), тогда как эквивалент C, использующий библиотеку GMP, работает только за 0,04 секунды. Это в два раза медленнее.
Есть ли способ получить такое же исполнение в моей программе Go?
Я голосующий, чтобы закрыть этот вопрос как не по теме, потому что это запрос на проверку кода. – Olaf
Как это запрос на проверку кода? Я не хочу оптимизировать * эту * программу специально, но чтобы узнать, как получить те же самые функции на двух языках. Я попытался сделать обе программы настолько же похожими, насколько это возможно, чтобы получить необъективный бенчмарк. Ответ может быть другой арифметической арифметической библиотекой Go, например. – Arno
Если вы хотите сравнить операции, вам необходимо установить воспроизводимый тест. Мы не знаем, как вы компилируете и запускаете свой код. В моей системе код go вычисляет 10000 в ~ 55 мс. – JimB