我有一个工作正常的记录器,但在内存分配方面会产生相当多的开销。下面的Debug()函数不是故意打印的,因为logOutputLevel不够高。
var logOutputLevel = 2
func Debug(s string, args ...interface{}) {
if logOutputLevel > 1 { return }
fmt.Printf(s, args...)
}
在向它传递值时,该方法仍然会产生相当多的分配。将指针传递给它时,它不会产生大量分配。请参阅以下基准:
func BenchmarkLog(b *testing.B) {
x := "abc"
for n := 0; n < b.N; n++ {
Debug("test %s", x)
}
}
func BenchmarkLogRef(b *testing.B) {
x := "abc"
for n := 0; n < b.N; n++ {
Debug("test %s", &x)
}
}
生产:
BenchmarkLog-8 50000000 43.1 ns/op 16 B/op 1 allocs/op
BenchmarkLogRef-8 500000000 3.17 ns/op 0 B/op 0 allocs/op
现在一切都很好,我正在尝试重新设计该Debug()方法以仅接受一个字符串和无限指针参数。稍后,fmt.Printf()如果日志级别足够高,我想“取消引用”所有参数并将它们传递给。
我怎样才能做到这一点?“仅指针”是否有特定的语言习语?我假设这...*interface{}意味着指向 an 的指针interface{}(而不是任何值都应该是指针)。
波斯汪
swift3中函数交换参数已经取消
函数的参数
js函数怎么传入数组元素作为参数
函数引用参数的问题
相关分类