从函数的名称判断,性能并不是那么关键,甚至不能仅仅为了节省将参数作为参数传递所需的时间/空间而考虑将参数移动到全局变量(像判断文件这样的IO操作比调用函数并将值传递给它们慢得多).
int
Go中的参数始终按值传递,并生成所传递值的副本.如果传递指针,指针值将被复制并传递.当一个切片被传递时,切片值(一个小的描述符)将被复制并传递——它将指向同一个备份数组(不会被复制).
另外,如果您需要在函数中多次访问片,参数通常是额外的收获,因为编译器可以进一步优化/缓存,而如果它是全局变量,则必须更加小心.
更多关于切片及其内部 struct 的信息:Go Slices: usage and internals
如果你想要准确的性能数据,基准测试!
slices_test.gogo test -bench .
package main
import (
"testing"
)
var gslice = make([]string, 1000)
func global(s string) {
for i := 0; i < 100; i++ { // Cycle to access slice may times
_ = s
_ = gslice // Access global-slice
}
}
func param(s string, ss []string) {
for i := 0; i < 100; i++ { // Cycle to access slice may times
_ = s
_ = ss // Access parameter-slice
}
}
func BenchmarkParameter(b *testing.B) {
for i := 0; i < b.N; i++ {
param("hi", gslice)
}
}
func BenchmarkGlobal(b *testing.B) {
for i := 0; i < b.N; i++ {
global("hi")
}
}
输出示例:
testing: warning: no tests to run
PASS
BenchmarkParameter-2 30000000 55.4 ns/op
BenchmarkGlobal-2 30000000 55.1 ns/op
ok _/V_/workspace/IczaGo/src/play 3.569s