登录
首页 >  Golang >  Go问答

哪个更有效:返回指向 uint 的指针还是返回 uint 的指针?

来源:stackoverflow

时间:2024-03-19 18:45:28 123浏览 收藏

在 Go 语言中,返回指向 uint 类型的指针或直接返回 uint 值的效率差异因具体情况而异。通常,返回指针速度较慢,需要分配堆内存,而返回 uint 值则无需分配。但是,禁用编译器优化后,返回指针的效率差异可能很明显。在实际应用中,应通过基准测试来确定返回指针是否会产生明显的效率影响。

问题内容

在 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 值则不需要。

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

作为参考,以下是启用编译器优化的结果(默认行为):

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() 没有任何区别。。

今天关于《哪个更有效:返回指向 uint 的指针还是返回 uint 的指针?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>