Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 返回指向uint或uint的指针更有效率的是什么?_Performance_Pointers_Go - Fatal编程技术网

Performance 返回指向uint或uint的指针更有效率的是什么?

Performance 返回指向uint或uint的指针更有效率的是什么?,performance,pointers,go,Performance,Pointers,Go,在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 <

在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()
    }
}
测试结果如下:

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

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

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

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()
    }
}
测试结果如下:

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

谢谢您的回答。我也不知道编译器标志。但是,在测试执行过程中,在benchmem之前似乎有太多的空间。@nilsmagnus是的,这只是答案中的一个输入错误,我在运行测试时没有。不幸的是,带有优化功能的微基准并不能告诉你太多,因为优化是非常上下文敏感的——特别是像省略和转义分析这样的事情。唯一真正有意义的基准是实际使用它的代码的基准;微基准测试的价值非常有限,通常弊大于利,因为它给开发人员的印象是,他们已经找到了一条有用的性能经验法则。@Adrian这正是为什么第一个基准测试是在禁用优化的情况下进行的,而第二个基准测试是为了表明优化可能会对此产生巨大影响。在回答中,我还建议询问者应该对其实际的、真实的代码进行基准测试。谢谢你的回答。我也不知道编译器标志。但是,在测试执行过程中,在benchmem之前似乎有太多的空间。@nilsmagnus是的,这只是答案中的一个输入错误,我在运行测试时没有。不幸的是,带有优化功能的微基准并不能告诉你太多,因为优化是非常上下文敏感的——特别是像省略和转义分析这样的事情。唯一真正有意义的基准是实际使用它的代码的基准;微基准测试的价值非常有限,通常弊大于利,因为它给开发人员的印象是,他们已经找到了一条有用的性能经验法则。@Adrian这正是为什么第一个基准测试是在禁用优化的情况下进行的,而第二个基准测试是为了表明优化可能会对此产生巨大影响。在回答中,我还建议询问者应该对其实际的、真实的代码进行基准测试。