Go语言 传值和传指针性能对比
2014-04-20 21:11
309 查看
转载自达达的博客
以往的C编程经验告诉我们,指针传参会有更好的性能,在Go语言中,这条经验也是通用的。但是需要留意两个问题:
指针传参会导致参数的操作领域不确定,到底函数内部会不会改变传入的对象呢?Go语言中没有类型C那样的const关键字,所以无法控制。
Go语言是有GC的,并且这个GC还不是很完善,受对象数量影响较大,传递指针意味着可能多创建不必要的对象,到底指针传参带来的性能提升能不能抵消创建对象产生的GC压力呢?这是一个不好观察到的数据。(原作者达达这里应该是有错误的,首先传值也是复制,要产生一个新对象,分配内存地址传到新的函数中,其次指针一般来说64个字节,复制的代价远小大中型数据传值,因此在都产生一个新对象的情况下,指针还是远优先于传大中型的值结构)
下面是性能消耗的测试代码:
测试值传参和指针传参的效率。
实验结果:
以往的C编程经验告诉我们,指针传参会有更好的性能,在Go语言中,这条经验也是通用的。但是需要留意两个问题:
指针传参会导致参数的操作领域不确定,到底函数内部会不会改变传入的对象呢?Go语言中没有类型C那样的const关键字,所以无法控制。
Go语言是有GC的,并且这个GC还不是很完善,受对象数量影响较大,传递指针意味着可能多创建不必要的对象,到底指针传参带来的性能提升能不能抵消创建对象产生的GC压力呢?这是一个不好观察到的数据。(原作者达达这里应该是有错误的,首先传值也是复制,要产生一个新对象,分配内存地址传到新的函数中,其次指针一般来说64个字节,复制的代价远小大中型数据传值,因此在都产生一个新对象的情况下,指针还是远优先于传大中型的值结构)
下面是性能消耗的测试代码:
package labs02 import "testing" type BigStruct struct { C01 uint64 C02 uint64 C03 uint64 C04 uint64 C05 uint64 C06 uint64 C07 uint64 C08 uint64 C09 uint64 C10 uint64 C11 uint64 C12 uint64 C13 uint64 C14 uint64 C15 uint64 C16 uint64 C17 uint64 C18 uint64 C19 uint64 C20 uint64 C21 uint64 C22 uint64 C23 uint64 C24 uint64 C25 uint64 C26 uint64 C27 uint64 C28 uint64 C29 uint64 C30 uint64 } func Invoke1(a *BigStruct) uint64 { return a.C30 } func Invoke2(a BigStruct) uint64 { return a.C30 } func Benchmark_Invoke1(b *testing.B) { var a = new(BigStruct) for i := 0; i < b.N; i++ { Invoke1(a) } } func Benchmark_Invoke2(b *testing.B) { var a = BigStruct{} for i := 0; i < b.N; i++ { Invoke2(a) } }
测试值传参和指针传参的效率。
实验结果:
dada-imac:misc dada$ go test -test.bench="." labs02 testing: warning: no tests to run PASS Benchmark_Invoke1 2000000000 0.52 ns/op Benchmark_Invoke2 100000000 12.8 ns/op ok labs02 2.403s
相关文章推荐
- [笔记]Go语言的字符串拼装方式性能对比
- Google:C++、Java、Scala、Go四种语言性能对比
- go语言和java+jetty的web hello world 性能测试对比
- [独家] Go1.8大幅改进了海量对象的GC性能(不同语言的横向对比)
- Go语言 整数和浮点数性能对比
- go语言指针探索
- Go Web编程(Go语言性能好、语法简单、开发效率高!)
- Go语言的指针的一些测试
- go语言 功能测试和性能测试的示例
- 裸指针和智能指针的性能对比
- golang与node.js的http模块性能对比测试(go1)
- Go Web编程(Go语言性能好、语法简单、开发效率高!)
- go语言和C语言的对比
- Go语言HTTP测试及程序性能调优
- golang与node.js的http模块性能对比测试(go1)
- GO语言中的指针
- Go语言学习记录之一(返回指针与返回值的区别)
- Go语言指针访问结构体的方法
- Go语言中的指针运算实例分析
- Java, Python, Ruby, PHP, C等语言性能对比