اولویت 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 is created without a size hint; there may be more allocations at runtime.
توصیه میشود:
files, _ := os.ReadDir("./files")
m := make(map[string]os.FileInfo, len(files))
for _, f := range files {
m[f.Name()] = f
}
// m is created with a size hint; there may be fewer allocations at runtime.
تعیین ظرفیت برش
در اکثر موارد، هنگام مقداردهی اولیه یک برش با make()
، اطلاعات ظرفیت را ارائه دهید، به ویژه هنگام اضافه کردن به برش.
make([]T, طول, ظرفیت)
برخلاف نقشهها، ظرفیت برش فقط یک تلمیح نیست: کامپایلر حافظه کافی را برای ظرفیت برش ارائه شده در make()
تخصیص میدهد، به این معنی که عملیات بعدی append()
باعث تخصیص حافظه صفر میشود (تا زمانی که طول برش به ظرفیت خود برسد، پس از آن هر 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)
}
}