我正在学习 Go 并开始使用该math/big包来处理任意长度的整数。
我写了这个程序来计算第 n 个斐波那契数:(去掉了imports):
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 程序在 0.1 秒(平均)内计算术语 100,000,而使用 GMP 库的 C 等效项仅在 0.04 秒内运行。那慢了两倍。
有没有办法在我的 Go 程序中获得相同的性能?
慕尼黑的夜晚无繁华
心有法竹
相关分类