Отдавайте предпочтение strconv перед fmt
При преобразовании примитивов в строки или из строк в примитивы strconv
быстрее, чем fmt
.
Не рекомендуется:
for i := 0; i < b.N; i++ {
s := fmt.Sprint(rand.Int())
}
Рекомендуется:
for i := 0; i < b.N; i++ {
s := strconv.Itoa(rand.Int())
}
Избегайте преобразования строк в байты
Избегайте повторного создания среза байтов из фиксированной строки. Вместо этого выполните преобразование один раз и сохраните результат.
Не рекомендуется:
for i := 0; i < b.N; i++ {
w.Write([]byte("Hello world"))
}
Рекомендуется:
data := []byte("Hello world")
for i := 0; i < b.N; i++ {
w.Write(data)
}
Укажите емкость контейнера
Укажите емкость контейнера, если это возможно, чтобы предварительно выделить память для контейнера. Это минимизирует последующие выделения (путем копирования и изменения размера контейнера) при добавлении элементов.
Подсказка емкости для map
В большинстве случаев предоставьте информацию о емкости при инициализации с помощью make()
.
make(map[T1]T2, hint)
Предоставление подсказки о емкости для make()
попытается изменить размер карты при инициализации, уменьшая повторное выделение памяти при добавлении элементов в карту.
Обратите внимание, что, в отличие от срезов, подсказка емкости карты не гарантирует полного предварительного выделения, но используется для оценки необходимого количества корзин хэш-таблицы. Следовательно, выделение памяти все равно может происходить при добавлении элементов в карту, даже при указании емкости карты.
Не рекомендуется:
m := make(map[string]os.FileInfo)
files, _ := os.ReadDir("./files")
for _, f := range files {
m[f.Name()] = f
}
// m создается без подсказки по размеру; может быть больше выделений во время выполнения.
Рекомендуется:
files, _ := os.ReadDir("./files")
m := make(map[string]os.FileInfo, len(files))
for _, f := range files {
m[f.Name()] = f
}
// m создается с указанием подсказки по размеру; может быть меньше выделений во время выполнения.
Укажите емкость среза
В большинстве случаев предоставьте информацию о емкости при инициализации среза с помощью make()
, особенно при добавлении в срез.
make([]T, length, capacity)
В отличие от карт, емкость среза не только подсказка: компилятор выделит достаточно памяти для предоставленной емкости среза в make()
, что означает, что последующие операции append()
приведут к нулевым выделениям (до тех пор, пока длина среза не совпадет с его емкостью, после чего любое добавление может изменить размер для вмещения дополнительных элементов).
Не рекомендуется:
for n := 0; n < b.N; n++ {
data := make([]int, 0)
for k := 0; k < size; k++{
data = append(data, k)
}
}
Рекомендуется:
for n := 0; n < b.N; n++ {
data := make([]int, 0, size)
for k := 0; k < size; k++{
data = append(data, k)
}
}