分享
  1. 首页
  2. 文章

Go语言 传值和传指针性能对比

abv123456789 · · 10388 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

转载自达达的博客


以往的C编程经验告诉我们,指针传参会有更好的性能,在Go语言中,这条经验也是通用的。但是需要留意两个问题:

  1. 指针传参会导致参数的操作领域不确定,到底函数内部会不会改变传入的对象呢?Go语言中没有类型C那样的const关键字,所以无法控制。
  2. 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

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:abv123456789

查看原文:Go语言 传值和传指针性能对比

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
10388 次点击
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏