You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言指针传递与返回性能测试结果反常疑问求助

Go函数参数传递与返回的基准测试异常结果分析

和同事探讨Go语言中向函数传递指针及返回指针是否更高效,为此编写了4组基准测试函数,覆盖四种参数传递与返回方式:

  • 传值入参,生成新变量并返回副本
  • 传值入参,生成新变量并返回指针
  • 传指针入参,生成新变量并返回副本
  • 传指针入参,原地修改值无返回

测试代码

package main

import (
    "fmt"
    "testing"
)

type MyStruct struct {
    myString string
}

func acceptParamReturnVariable(s MyStruct) MyStruct {
    ns := MyStruct{
        fmt.Sprintf("I'm quoting this: \"%s\"", s.myString),
    }
    return ns
}

func acceptParamReturnPointer(s MyStruct) *MyStruct {
    ns := MyStruct{
        fmt.Sprintf("I'm quoting this: \"%s\"", s.myString),
    }
    return &ns
}

func acceptPointerParamReturnVariable(s *MyStruct) MyStruct {
    ns := MyStruct{
        fmt.Sprintf("I'm quoting this: \"%s\"", s.myString),
    }
    return ns
}

func acceptPointerParamNoReturn(s *MyStruct) {
    s.myString = fmt.Sprintf("I'm quoting this: \"%s\"", s.myString)
}

func BenchmarkNormalParamReturnVariable(b *testing.B) {
    s := MyStruct{
        myString: "Hello World",
    }
    var ns MyStruct
    for i := 0; i < b.N; i++ {
        ns = acceptParamReturnVariable(s)
    }
    _ = ns
}

func BenchmarkNormalParamReturnPointer(b *testing.B) {
    s := MyStruct{
        myString: "Hello World",
    }
    var ns *MyStruct
    for i := 0; i < b.N; i++ {
        ns = acceptParamReturnPointer(s)
    }
    _ = ns
}

func BenchmarkPointerParamReturnVariable(b *testing.B) {
    s := MyStruct{
        myString: "Hello World",
    }
    var ns MyStruct
    for i := 0; i < b.N; i++ {
        ns = acceptPointerParamReturnVariable(&s)
    }
    _ = ns
}

func BenchmarkPointerParamNoReturn(b *testing.B) {
    s := MyStruct{
        myString: "Hello World",
    }
    for i := 0; i < b.N; i++ {
        acceptPointerParamNoReturn(&s)
    }
    _ = s
}

测试命令与结果

执行基准测试命令:

$ go test -run=XXXX -bench=. -benchmem

测试输出结果:

goos: darwin
goarch: amd64
pkg: XXXX
cpu: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
BenchmarkNormalParamReturnVariable-16           10538138               103.3 ns/op            48 B/op          2 allocs/op
BenchmarkNormalParamReturnPointer-16             9526380               201.2 ns/op            64 B/op          3 allocs/op
BenchmarkPointerParamReturnVariable-16           7542066               147.0 ns/op            48 B/op          2 allocs/op
BenchmarkPointerParamNoReturn-16                   45897            119265 ns/op          924351 B/op          5 allocs/op

疑问

测试前预期传指针入参,原地修改值无返回的方式效率最高,因为函数内无需创建新变量,仅传递内存地址,但实际结果显示该方式耗时最长、内存占用最多,求专业人士解释原因。


内容的提问来源于stack exchange,提问作者SynackSA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:38:00