Sunday, June 22, 2025
HomeGolangGenerics benchmarks - Technical Dialogue

Generics benchmarks – Technical Dialogue


Comparable outcomes have been obtained for various platforms and architectures.
It’s not a language downside in any respect, is it?

kind Signed interface  ~int16 

kind Getter interface {
	Get(int) int
}

kind GetObj struct {}

func (o *GetObj) Get(i int) int {
	return i * i
}

kind GenGetter[T Signed] interface {
	Get(T) T
}

kind 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

And that is in all probability the improper model, however I’ll give it anyway:

func BenchmarkReg(b *testing.B) {
	var obj = &GetObj{}
	for i := vary b.N {
		reg(obj, i)
	}
}

func BenchmarkIface(b *testing.B) {
	var obj = &GetObj{}
	for i := vary b.N {
		iface(obj, i)
	}
}


func BenchmarkGen(b *testing.B) {
	var obj = &GenGetObj[int]{}
	for i := vary b.N {
		gen(obj, i)
	}
}
BenchmarkReg-4          1000000000               0.3700 ns/op
BenchmarkReg-4          1000000000               0.3609 ns/op
BenchmarkReg-4          1000000000               0.3643 ns/op
BenchmarkReg-4          1000000000               0.3616 ns/op
BenchmarkReg-4          1000000000               0.3778 ns/op
BenchmarkIface-4        1000000000               0.3492 ns/op
BenchmarkIface-4        1000000000               0.3651 ns/op
BenchmarkIface-4        1000000000               0.3571 ns/op
BenchmarkIface-4        1000000000               0.3629 ns/op
BenchmarkIface-4        1000000000               0.3499 ns/op
BenchmarkGen-4          419146522                2.703 ns/op
BenchmarkGen-4          420824724                2.777 ns/op
BenchmarkGen-4          416835702                2.740 ns/op
BenchmarkGen-4          415282959                2.803 ns/op
BenchmarkGen-4          426988256                2.732 ns/op

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments