@
yu1miao #100 准确的说这里有 6 种情况,你 benchmark 跑一下就能看出来泛型实现的问题了。
这里跟 writeGeneric 直接传结构体的性能跟用接口,并且编译器没有进行 devirtualize 是相同的,并不会像你说的那样专门生成一个 writeGeneric(w *Buffer) error
如果你传进去的是一个接口,调用开销直接就翻倍了。
func Benchmark_interface_0(b *testing.B) {
var buf = &Buffer{}
for i := 0; i < b.N; i++ {
write(buf)
}
}
func Benchmark_interface_1(b *testing.B) {
var buf io.ByteWriter = &Buffer{}
for i := 0; i < b.N; i++ {
write(buf)
}
}
func Benchmark_interface_2(b *testing.B) {
var buf IBuffer = &Buffer{}
for i := 0; i < b.N; i++ {
write(buf)
}
}
func Benchmark_generic_0(b *testing.B) {
var buf = &Buffer{}
for i := 0; i < b.N; i++ {
writeGeneric(buf)
}
}
func Benchmark_generic_1(b *testing.B) {
var buf io.ByteWriter = &Buffer{}
for i := 0; i < b.N; i++ {
writeGeneric(buf)
}
}
func Benchmark_generic_2(b *testing.B) {
var buf IBuffer = &Buffer{}
for i := 0; i < b.N; i++ {
writeGeneric(buf)
}
}
Benchmark_interface_0-16 232742709 5.139 ns/op 0 B/op 0 allocs/op
Benchmark_interface_1-16 434387566 2.794 ns/op 0 B/op 0 allocs/op
Benchmark_interface_2-16 85636600 14.67 ns/op 0 B/op 0 allocs/op
Benchmark_generic_0-16 85636600 13.97 ns/op 0 B/op 0 allocs/op
Benchmark_generic_1-16 54496902 24.23 ns/op 0 B/op 0 allocs/op
Benchmark_generic_2-16 49954623 24.91 ns/op 0 B/op 0 allocs/op