Similar results were obtained for different platforms and architectures.
It’s not a language problem, is it?
``
type Signed interface {
~int | ~int8 | ~int16 | ~int32 | ~int64;
}
type Getter interface {
Get(int) int
}
type GetObj struct {}
func (o *GetObj) Get(i int) int {
return i * i
}
type GenGetter[T Signed] interface {
Get(T) T
}
type GenGetObj[T Signed] struct {}
func (o *GenGetObj[T]) Get(i T) T {
return i * i
}
func reg(obj *GetObj, i int) int {
return obj.Get(i)
}
func iface(obj Getter, i int) int {
return obj.Get(i)
}
func gen[T Signed](obj GenGetter[T], i T) T {
return obj.Get(i)
}
func BenchmarkReg(b *testing.B) {
var obj = &GetObj{}
var i = 0
for b.Loop() {
reg(obj, i)
i++
}
}
func BenchmarkIface(b *testing.B) {
var obj = &GetObj{}
var i = 0
for b.Loop() {
iface(obj, i)
i++
}
}
func BenchmarkGen(b *testing.B) {
var obj = &GenGetObj[int]{}
var i = 0
for b.Loop() {
gen(obj, i)
i++
}
}
BenchmarkReg-4 441981427 2.743 ns/op
BenchmarkReg-4 428439991 2.810 ns/op
BenchmarkReg-4 422647483 2.775 ns/op
BenchmarkReg-4 414114366 2.839 ns/op
BenchmarkReg-4 429933127 2.720 ns/op
BenchmarkIface-4 260450607 4.558 ns/op
BenchmarkIface-4 258018102 4.488 ns/op
BenchmarkIface-4 248518578 4.655 ns/op
BenchmarkIface-4 257133632 4.517 ns/op
BenchmarkIface-4 272843784 4.386 ns/op
BenchmarkGen-4 245088946 4.932 ns/op
BenchmarkGen-4 248562715 4.826 ns/op
BenchmarkGen-4 245683516 4.812 ns/op
BenchmarkGen-4 239086440 4.948 ns/op
BenchmarkGen-4 228736507 5.074 ns/op