2016-03-21 15 views
5

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ı?

+1

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

+0

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

+2

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

cevap

4

GOGC ayarı = geliştirilmiş performans (100 ms'den daha az). Niye ya? escape analysis numaralı numaralı belge. go build -gcflags -m ile oluşturduğunuzda, derleyici, öbeği yığınlara kaçarsa yazdırır. Bu gerçekten makinenize ve GO derleyici sürümüne bağlıdır, ancak derleyici ayırmanın yığına taşınması gerektiğine karar verirse, 2 şey demektir: 1. ayırma daha uzun sürebilir (yığında "ayırma" sadece 1 cpu komutu olduğundan) 2. GC daha sonra o hafızayı temizlemek zorunda kalacak - makinem için daha fazla CPU zamanı için maliyeti, 65536 bayt ayırma yığınına kaçar ve 65535 yapmaz. bu nedenle 1 bayt, tüm işlemleri 200 ms'den 30 saniyeye değiştirdi. Amazing ..