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

转载自达达的博客


以往的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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值