ระดับการเขียนโค้ดที่แนะนำ

ส่วนนี้เสนอแนวทางการเขียนโค้ด Golang ที่มีประสิทธิภาพสำหรับการปรับปรุงความเร็ว

โปรดใช้ strconv แทน fmt

เมื่อทำการแปลง primitives เป็น strings หรือจาก strings เป็น primitives, 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())
}

หลีกเลี่ยงการแปลง strings เป็น bytes

หลีกเลี่ยงการสร้าง byte slice จาก fixed string อย่างยิ่ง แทนที่จะทำการแปลงอีกครั้ง ให้ทำการแปลงครั้งเดียวและเก็บผลลัพธ์ไว้

ไม่แนะนำ:

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

ระบุความจุของคอนเทนเนอร์

ระบุความจุของคอนเทนเนอร์เมื่อเป็นไปได้ เพื่อทำการพรี-อละโลเกตเมมโมรีสำหรับคอนเทนเนอร์ ซึ่งจะทำให้มีการจัดสร้างใหม่ (โดยการคัดลอกและปรับขนาดของคอนเทนเนอร์) เมื่อเพิ่ม elements

คำแนะนำในการกำหนดความจุของแผนที่

ในกรณีส่วนใหญ่ ให้ข้อมูลความจุเมื่อทำการเริ่มต้นด้วย make().

make(map[T1]T2, hint)

การให้ข้อมูลความจุกับ make() จะพยายามปรับขนาดแผนที่ที่การเริ่มต้น ลดการจัดสร้างหน่วยความจำเมื่อเพิ่ม elements เข้าไปในแผนที่

โปรดทราบว่า ไม่เหมือนกับ slices, การให้ข้อมูลความจุของแผนที่ไม่ได้รับการรับรองว่าจะมีการจัดสร้างให้ครบหมด แต่ถูกนำไปใช้เพื่อประมาณจำนวนของบั๊กเก็ตที่ต้องการ ดังนั้น การจัดสร้างอาจจะเกิดขึ้นเมื่อมีการเพิ่ม elements เข้าไปในแผนที่ แม้ว่าการระบุความจุของแผนที่ไว้ล่วงหน้า

ไม่แนะนำ:

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 ถูกสร้างพร้อมข้อแนะนำขนาด; อาจจะมีการจัดสร้างน้อยลงระหว่างการทำงาน

การระบุความจุของ slices

ในกรณีส่วนใหญ่, ให้ข้อมูลความจุเมื่อทำการเริ่มต้น slices ด้วย make(), โดยเฉพาะเมื่อมีการเพิ่ม elements เข้าไปใน slices

make([]T, length, capacity)

ไม่เหมือนกับแผนที่, ความจุของ slices ไม่ใช่เพียงแค่คำแนะนำ: คอมไพเลอร์จะจัดสร้างหน่วยความจำเพียงพอสำหรับการรับความจุของ slices ที่ให้ไว้ใน make(), ซึ่งหมายความว่าการดำเนินการ append() ต่อมาจะไม่มีการจัดสร้างใดๆ (จนกว่าความยาวของ slices จะเท่ากับความจุ, เมื่อที่ append อาจจะปรับขนาดเพื่อรองรับ elements เพิ่มเติม)

ไม่แนะนำ:

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