Benchmark Retornos Nomeados vs Explicitos em Go
No nosso grupo de estudos de Go, surgiu uma dúvida: retornos nomeados são mais rápidos que retornos explícitos? A hipótese é essa.
Felizmente, Go tem boas ferramentas para testar isso.
Vamos criar um código com duas funções de soma: uma com retornos nomeados e outra com retornos explícitos.
package main
import (
"testing"
)
// Função com retornos nomeados
func somaNomeados(a, b int) (resultado int, err error) {
resultado = a + b
return
}
// Função com retornos explícitos
func somaExplicitos(a, b int) (int, error) {
return a + b, nil
}
Depois, criamos as funções de benchmark. O nome dessas funções é importante. A ferramenta de testes do Go procura funções que começam com “Benchmark”.
func BenchmarkSomaNomeados(b *testing.B) {
for i := 0; i < b.N; i++ {
somaNomeados(1, 2)
}
}
func BenchmarkSomaExplicitos(b *testing.B) {
for i := 0; i < b.N; i++ {
somaExplicitos(1, 2)
}
}
Nomeie o arquivo como benchmark_retornos_test.go
. O nome do arquivo é importante. Ele deve terminar com _test.go
para que o Go encontre os testes.
Para rodar o benchmark, execute:
go test -bench=.
No meu caso, o resultado foi:
goos: darwin
goarch: arm64
pkg: benchmarkRetorno
cpu: Apple M2
BenchmarkSomaNomeados-8 1000000000 0.2926 ns/op
BenchmarkSomaExplicitos-8 1000000000 0.2879 ns/op
PASS
ok benchmarkRetorno 1.167s
Surpreendentemente, os retornos explícitos foram um pouco mais rápidos em vários testes. Isso pode ser uma anomalia causada pela instrumentação do Go. Diferenças de sub-nanosegundos podem ser ignoradas.
Ao compilar com go build
, o código binário das duas funções é igual.
Concluindo, retornos nomeados e explícitos têm o mesmo desempenho. Escolha entre eles com base na legibilidade do código.
Vídeo com a explicação: