Ưu tiên strconv hơn fmt

Khi chuyển đổi các nguyên thủy thành chuỗi hoặc từ chuỗi sang nguyên thủy, strconv nhanh hơn fmt.

Không khuyến nghị:

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

Khuyến nghị:

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

Tránh chuyển đổi chuỗi thành byte

Tránh tạo lặp đi lặp lại một dãy byte từ một chuỗi cố định. Thay vào đó, thực hiện chuyển đổi một lần và lưu kết quả.

Không khuyến nghị:

for i := 0; i < b.N; i++ {
  w.Write([]byte("Xin chào thế giới"))
}

Khuyến nghị:

data := []byte("Xin chào thế giới")
for i := 0; i < b.N; i++ {
  w.Write(data)
}

Chỉ định sức chứa của container

Nếu có thể, hãy chỉ định sức chứa của container để trước cấp phát bộ nhớ cho container. Điều này giảm thiểu các cấp phát sau (bằng cách sao chép và thay đổi kích thước của container) khi thêm phần tử.

Gợi ý sức chứa cho map

Trong hầu hết các trường hợp, cung cấp thông tin về sức chứa khi khởi tạo bằng make().

make(map[T1]T2, hint)

Việc cung cấp một gợi ý sức chứa cho make() sẽ cố gắng thay đổi kích thước của map khi khởi tạo, giảm thiểu việc cấp phát lại bộ nhớ khi thêm phần tử vào map.

Lưu ý rằng, khác với slices, gợi ý sức chứa của map không đảm bảo việc cấp phát hoàn toàn trước, mà chỉ được sử dụng để ước lượng số lượng ô bộ nhớ để lưu trữ các phần tử. Do đó, việc cấp phát vẫn có thể xảy ra khi thêm các phần tử vào map, ngay cả khi đã chỉ định sức chứa của map.

Không khuyến nghị:

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

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

// m được tạo mà không có gợi ý về kích thước; có thể cấp phát thêm khi chạy.

Khuyến nghị:

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

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

// m được tạo với gợi ý về kích thước; có thể ít cấp phát hơn khi chạy.

Gợi ý sức chứa cho slice

Trong hầu hết các trường hợp, cung cấp thông tin về sức chứa khi khởi tạo một slice bằng make(), đặc biệt khi thêm vào slice.

make([]T, length, capacity)

Khác với map, sức chứa của slice không chỉ là gợi ý: trình biên dịch sẽ cấp phát đủ bộ nhớ cho sức chứa được cung cấp trong make(), có nghĩa là các hoạt động append() sau đó sẽ không cần cấp phát mới (cho đến khi độ dài của slice bằng sức chứa của nó, sau đó bất kỳ thêm vào nào cũng có thể thay đổi kích thước để chứa thêm phần tử).

Không khuyến nghị:

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

Khuyến nghị:

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