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