الأفضلية لـ 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)
}
تحديد سعة الحاوية
حدد سعة الحاوية إذا كان ذلك ممكنًا لتخصيص الذاكرة مسبقًا للحاوية. يُقلل هذا من التخصيصات الفرعية (بواسطة النسخ وتغيير حجم الحاوية) عند إضافة العناصر.
تلميح سعة الخريطة
في معظم الحالات، قدم معلومات السعة عند التهيئة باستخدام make()
.
make(map[T1]T2, تلميح)
تقدم معلومات السعة إلى 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, الطول, السعة)
على عكس الخرائط، سعة الشريحة ليست مجرد تلميح: سيقوم المترجم بتخصيص كمية كافية من الذاكرة لسعة الشريحة المقدمة في 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)
}
}