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)
    }
}

código fonte

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:

Cesar Gimenes

Última modificação