GO'da bellek ayırma performansını kontrol ederken ilginç bir şey üzerinde tökezledim.golang dilim ayırma performansı
package main
import (
"fmt"
"time"
)
func main(){
const alloc int = 65536
now := time.Now()
loop := 50000
for i := 0; i<loop;i++{
sl := make([]byte, alloc)
i += len(sl) * 0
}
elpased := time.Since(now)
fmt.Printf("took %s to allocate %d bytes %d times", elpased, alloc, loop)
}
ben gitmek sürüm 1.6 64 bit (32bit aynı sonuçlar) ve 16GB RAM (WINDOWS 10) alloc 65536 (tam olarak 64K) olduğunda yüzden çalışan bir çekirdek-i7 2600 tarihinde bu çalıştırıyorum 30 saniye (!!!!). Tahsisatı 65535 olduğunda, ~ 200ms sürer. Birisi bunu bana açıklayabilir mi lütfen? Aynı kodu evde i7-920 @ 3.8GHZ ile denedim, ancak aynı sonuçları göstermedi (her ikisi de yaklaşık 200ms aldı). Neler olduğu hakkında bir fikri olan var mı?
Daha da fazla varyasyon eklemek için kodunuzu bir Windows 7'de (Go 1.6, 64 bit) deneyerek, 'alloc' '65536' veya' 65535' olursa olsun 17 saniyelim. – icza
Tahsis içselleri konusunda uzman değilim, ama sadece bir 65536 baytlık bir dilim ayırmanın artı 2 tamsayıyı ('len 've' cap' sayaçlarını) tahsis etmesinden bahsetmek istiyorum, bu yüzden aslında 64KB'den fazla. – Elwinar
Soruna daha fazla bilgi eklemek için, Archlinux (i7-4720HQ @ 2.60GHz) kodumu çalıştırdım ve sürekli olarak 600 ms alıyor. Profil oluşturma aracını uzun süren kurulumda kullanmayı denemelisiniz. Bunu zaten bilmiyorsanız, öğrenmeye başlamak aslında iyi bir durumdur. – Elwinar