Esta seção fornece diretrizes de codificação do ponto de vista de codificação Golang que são benéficas para melhorar o desempenho.

Prefira strconv em vez de fmt

Ao converter tipos primitivos para strings ou de strings para tipos primitivos, strconv é mais rápido que fmt.

Não recomendado:

for i := 0; i < b.N; i++ {
  s := fmt.Sprint(rand.Int())
}

Recomendado:

for i := 0; i < b.N; i++ {
  s := strconv.Itoa(rand.Int())
}

Evite converter strings em bytes

Evite criar repetidamente uma fatia de bytes a partir de uma string fixa. Em vez disso, faça a conversão uma vez e capture o resultado.

Não recomendado:

for i := 0; i < b.N; i++ {
  w.Write([]byte("Hello world"))
}

Recomendado:

data := []byte("Hello world")
for i := 0; i < b.N; i++ {
  w.Write(data)
}

Especifique capacidade do contêiner

Especifique a capacidade do contêiner, se possível, para pré-alocar memória para o contêiner. Isso minimiza alocações subsequentes (copiando e redimensionando o contêiner) ao adicionar elementos.

Dica de capacidade do mapa

Na maioria dos casos, forneça informações de capacidade ao inicializar com make().

make(map[T1]T2, dica)

Fornecer uma dica de capacidade para make() tentará redimensionar o mapa na inicialização, reduzindo a realocação de memória ao adicionar elementos ao mapa.

Observação: diferentemente das fatias, uma dica de capacidade do mapa não garante pré-alocação completa, mas é usada para estimar o número de buckets do hashmap necessários. Portanto, a alocação ainda pode ocorrer ao adicionar elementos ao mapa, mesmo ao especificar a capacidade do mapa.

Não recomendado:

m := make(map[string]os.FileInfo)

files, _ := os.ReadDir("./files")
for _, f := range files {
    m[f.Name()] = f
}

// m é criado sem uma dica de tamanho; pode haver mais alocações em tempo de execução.

Recomendado:

files, _ := os.ReadDir("./files")

m := make(map[string]os.FileInfo, len(files))
for _, f := range files {
    m[f.Name()] = f
}

// m é criado com uma dica de tamanho; pode haver menos alocações em tempo de execução.

Especificar capacidade da fatia

Na maioria dos casos, forneça informações de capacidade ao inicializar uma fatia com make(), especialmente ao anexar à fatia.

make([]T, comprimento, capacidade)

Diferentemente dos mapas, a capacidade de uma fatia não é apenas uma dica: o compilador alocará memória suficiente para a capacidade fornecida em make(), o que significa que operações append() subsequentes resultarão em zero alocações (até que o comprimento da fatia corresponda à sua capacidade, após o qual qualquer anexo pode redimensionar para acomodar elementos adicionais).

Não recomendado:

for n := 0; n < b.N; n++ {
  data := make([]int, 0)
  for k := 0; k < size; k++{
    data = append(data, k)
  }
}

Recomendado:

for n := 0; n < b.N; n++ {
  data := make([]int, 0, size)
  for k := 0; k < size; k++{
    data = append(data, k)
  }
}