Ведь по заявлению разработчиков дженерики собираются в отдельные типы на стадии компиляции, а не в рантайме.
Результат работы бенчмарков выдает либо не оптимизированную реализацию, либо жесткий баг, либо я не правильно понял слова разработчиков.
Демонстрирую на игрушечном примере функции, суть которой проста:
func sumincr(arr []float64, incr float64) (sum float64) {
for _, x := range arr {
sum += x + incr
}
return sum
}
Код бенчей в песочнице по причинам объёма
https://go.dev/play/p/3wYzYzsIT_8
Результаты:
go test -bench=. -count=2
goos: windows
goarch: amd64
pkg: github.com/ogau/evo/bugtesting
cpu: AMD Ryzen 3 PRO 2200G with Radeon Vega Graphics
BenchmarkNativeFunc-4 4113319 298.7 ns/op
BenchmarkNativeFunc-4 3958936 295.3 ns/op
BenchmarkNativeMethod-4 4124042 290.2 ns/op
BenchmarkNativeMethod-4 3952284 295.9 ns/op
BenchmarkGenericFunc-4 2836564 409.9 ns/op
BenchmarkGenericFunc-4 2877542 423.8 ns/op
BenchmarkGenericMethod-4 443005 2628 ns/op
BenchmarkGenericMethod-4 399085 2555 ns/op
Несложно посчитать, что функция полностью использующая механизм обобщения с методом типа расходует в ~8.5 раз больше процессорного времени.
Кстати, что меня при тестах случайно поразило - если поменять порядок проведения бенчмарков, то результаты становятся непредсказуемыми (перепроверено много раз):
goos: windows
goarch: amd64
pkg: github.com/ogau/evo/bugtesting
cpu: AMD Ryzen 3 PRO 2200G with Radeon Vega Graphics
BenchmarkGenericMethod-4 476750 2654 ns/op
BenchmarkGenericMethod-4 427164 2593 ns/op
BenchmarkNativeFunc-4 2104059 571.9 ns/op
BenchmarkNativeFunc-4 2003337 565.6 ns/op
BenchmarkNativeMethod-4 2121109 579.8 ns/op
BenchmarkNativeMethod-4 2095996 575.0 ns/op
BenchmarkGenericFunc-4 2091612 574.3 ns/op
BenchmarkGenericFunc-4 2085957 574.6 ns/op
Вопрос продублирую на StackOverflow, ссылку прикреплю позже.
UPD:
https://stackoverflow.com/questions/71649364/why-i...