gpt4 book ai didi

performance - 返回指向 uint 或 uint 的指针哪个更有效?

转载 作者:IT王子 更新时间:2023-10-29 01:48:47 31 4
gpt4 key购买 nike

在 Go 中,从函数返回哪个更有效:返回 uint 还是返回 *uint

该函数在 cpu 密集型库的内部 for 循环中调用。

最佳答案

一般来说,只要效率是个问题,您就应该运行基准测试。

让我们创建非常简单的示例:

func fuint() uint {
return 0
}

func fpuint() *uint {
var i uint
return &i
}

以及基准测试代码:

func BenchmarkUint(b *testing.B) {
for i := 0; i < b.N; i++ {
fuint()
}
}

func BenchmarkPuint(b *testing.B) {
for i := 0; i < b.N; i++ {
fpuint()
}
}

需要注意的一件事:由于我们的函数非常简单,代码优化可能会使结果变得无用(例如,我们可能会看到相同的结果)。

因此,我们应该通过禁用编译器优化来进行测试。所以让我们像这样测试它:

go test -gcflags '-N -l' -bench . -benchmem

测试结果:

BenchmarkUint-4     500000000        3.21 ns/op      0 B/op     0 allocs/op
BenchmarkPuint-4 100000000 22.4 ns/op 8 B/op 1 allocs/op

正如我们所猜测的那样:分配一个 uint 值并返回指向它的指针速度较慢并且需要分配(在堆上),同时返回一个简单的 uint 值(value)没有。

但不要认为情况总是如此。在此测试期间,我们禁用了编译器优化。当您将应用程序编译为生产环境时,您显然不会禁用优化,因此您的真实示例可能没有这么大的差异,或者根本没有差异。测试/基准测试你的实际代码,看看返回一个指针是否真的有任何明显的不同。

作为引用,这里是启用编译器优化的结果(默认行为):

go test -bench . -benchmem

BenchmarkUint-4 2000000000 0.35 ns/op 0 B/op 0 allocs/op
BenchmarkPuint-4 2000000000 0.35 ns/op 0 B/op 0 allocs/op

在上面的具体示例中,fuint()fpuint() 完全没有区别

关于performance - 返回指向 uint 或 uint 的指针哪个更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54806572/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com