ระดับการเขียนโค้ดที่แนะนำ
ส่วนนี้เสนอแนวทางการเขียนโค้ด 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)
}
}