Esta sección proporciona pautas de codificación desde la perspectiva de codificación de Golang que son beneficiosas para mejorar el rendimiento.
Prefiera strconv sobre fmt
Cuando se convierten primitivas a cadenas o de cadenas a primitivas, strconv
es más rápido que fmt
.
No 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())
}
Evitar la conversión de cadenas a bytes
Evite crear repetidamente una matriz de bytes a partir de una cadena fija. En su lugar, realice la conversión una vez y capture el resultado.
No recomendado:
for i := 0; i < b.N; i++ {
w.Write([]byte("Hola mundo"))
}
Recomendado:
data := []byte("Hola mundo")
for i := 0; i < b.N; i++ {
w.Write(data)
}
Especificar la capacidad del contenedor
Especifique la capacidad del contenedor, si es posible, para preasignar memoria para el contenedor. Esto minimiza las asignaciones posteriores (mediante la copia y redimensionamiento del contenedor) al agregar elementos.
Sugerencia de capacidad del mapa
En la mayoría de los casos, proporcione información de capacidad al inicializar con make()
.
make(map[T1]T2, sugerencia)
Proporcionar una sugerencia de capacidad a make()
intentará redimensionar el mapa en la inicialización, reduciendo la reasignación de memoria al agregar elementos al mapa.
Tenga en cuenta que, a diferencia de las rebanadas, una sugerencia de capacidad de un mapa no garantiza una preasignación completa, pero se utiliza para estimar el número de buckets de hashmap requeridos. Por lo tanto, la asignación todavía puede ocurrir al agregar elementos al mapa, incluso al especificar la capacidad del mapa.
No recomendado:
m := make(map[string]os.FileInfo)
files, _ := os.ReadDir("./files")
for _, f := range files {
m[f.Name()] = f
}
// m se crea sin una sugerencia de tamaño; puede haber más asignaciones en tiempo de ejecución.
Recomendado:
files, _ := os.ReadDir("./files")
m := make(map[string]os.FileInfo, len(files))
for _, f := range files {
m[f.Name()] = f
}
// m se crea con una sugerencia de tamaño; puede haber menos asignaciones en tiempo de ejecución.
Especificar la capacidad de una rebanada
En la mayoría de los casos, proporcione información de capacidad al inicializar una rebanada con make()
, especialmente al agregar a la rebanada.
make([]T, longitud, capacidad)
A diferencia de los mapas, la capacidad de una rebanada no es solo una sugerencia: el compilador asignará suficiente memoria para la capacidad de rebanada proporcionada en make()
, lo que significa que las operaciones posteriores de append()
resultarán en cero asignaciones (hasta que la longitud de la rebanada coincida con su capacidad, después de lo cual cualquier append
puede redimensionarse para acomodar elementos adicionales).
No 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)
}
}