2013-02-25 37 views
6

Eminim ki herkesin golang olduğunu bilmesinin blog post olduğunu biliyor.Bu durumda gccgo neden gc'den daha yavaş?

Yeniden okuma, go build yerine gccgo kullanmanın hızını biraz daha artıracağını merak ettim. Tipik kullanım durumumda (bilimsel hesaplamalar), gccgo ile üretilen ikili, her zaman bir go build modelinden daha hızlıdır. havlak6.go ve onu derlemek:

Yani, sadece bu dosyayı kapmak

go build havlak6.go -O havlak6_go 
gccgo -o havlak6_gccgo -march=native -Ofast havlak6.go 

Sürpriz!

$/usr/bin/time ./havlak6_go 
5.45user 0.06system 0:05.54elapsed 99%CPU 

$/usr/bin/time ./havlak6_gccgo 
11.38user 0.16system 0:11.74elapsed 98%CPU 

Merak ediyorum ve bir "optimizasyon" derleyicisinin neden daha yavaş kod üretdiğini bilmek istiyorum. hiç şansım

gccgo -pg -march=native -Ofast havlak6.go 
./a.out 
gprof a.out gmon.out 

:

Ben gccgo oluşturulan ikili üzerinde gprof kullanmaya çalıştı

Flat profile: 

Each sample counts as 0.01 seconds. 
no time accumulated 

kod aslında profilli edilmemiştir Gördüğünüz gibi. Tabii

, ben this okudum, ama gördüğünüz gibi program çalıştırmak için 10 + saniye sürer ... numunelerin numarası olmalıdır> 1000

Ben de denedim:

rm a.out gmon.out 
LDFLAGS='-g -pg' gccgo -g -pg -march=native -Ofast havlak6.go 
./a.out 
gprof 

Hiçbir başarı yok.

Neyin yanlış olduğunu biliyor musunuz? gccgo neden tüm optimizasyon rutinlerinin bu durumda gc'dan daha hızlı başarısız olduğuna dair bir fikriniz var mı?

go sürümü: 1.0.2 gcc sürümü: 4.7.2

DÜZENLEME:

Oh, tamamen ben açıkçası gccgo -generated ikili üzerinde pprof çalıştı ... söylemeyi unutmuşum. .. İşte top10 geçerli:

Welcome to pprof! For help, type 'help'. 
(pprof) top10 
Total: 1143 samples 
    1143 100.0% 100.0%  1143 100.0% 0x00007fbfb04cf1f4 
     0 0.0% 100.0%  890 77.9% 0x00007fbfaf81101e 
     0 0.0% 100.0%  4 0.3% 0x00007fbfaf8deb64 
     0 0.0% 100.0%  1 0.1% 0x00007fbfaf8f2faf 
     0 0.0% 100.0%  3 0.3% 0x00007fbfaf8f2fc5 
     0 0.0% 100.0%  1 0.1% 0x00007fbfaf8f2fc9 
     0 0.0% 100.0%  1 0.1% 0x00007fbfaf8f2fd6 
     0 0.0% 100.0%  1 0.1% 0x00007fbfaf8f2fdf 
     0 0.0% 100.0%  2 0.2% 0x00007fbfaf8f4a2f 
     0 0.0% 100.0%  1 0.1% 0x00007fbfaf8f4a33 

Ve ben başka bir şey arıyorum bu yüzden.

EDIT2:

birilerinin Mavi dışarı gprof kullanmayı deneyin vermedi kapalı olması sorumu istiyor gibi görünüyor beri: https://groups.google.com/d/msg/golang-nuts/1xESoT5Xcd0/bpMvxQeJguMJ

+0

İnsanlar hala [* gropf'i canonik profiler. *] (Http://stackoverflow.com/a/1779343/23771). Bazı noktalar: 1) gprof, sadece tüm sembollere sahip olduğu, özyinesiz, sığ çağrı yığınlarına sahip CPU'ya bağlı programlar için kullanışlıdır. 2) Derleyici optimizasyonu, kodunuzda, kendilerinde işlev çağırmayan (bellek ayırma, vb.) Çok fazla denilen sıkı iç döngüler veya rutinler arasında fark yaratır. Derleyici optimizasyonu, her şeyin daha hızlı ilerlemesini sağlamaz. –

+0

Evet, gprof için aldım. Ve derleyici optimizasyonları konusunda size katılıyorum. Ancak, optimizasyon özellikli bir derleyici ile daha kötü performans beklemezdim. Performanslar eşit veya daha iyi olmalıdır. Eğer değilse, iyileştirme için bir yer var ve nedenini anlamak isterim :) –

+0

Yaptığım tek zamanlama, uçtan uca, muhtemelen 10^n kez tekrarlandı ve bölündü. 3 basamaktan fazla doğruluk. Gürültü var ve umrumda değil. Daha sonra, daha hızlı hale getirmenin yollarını aramak için rastgele duraklama kullanıyorum. Zaten bir sünger gibi sıkılmadıkça, yollar bulacağım ve sonra tekrar başarabileceğim. Birkaç döngüden sonra geri dönüşlerin azaldığı ve bilgisayarımın en çok oluşturduğum komutlar arasında yer alması durumunda optimizasyon cihazını çalıştırıyorum, bu da belki% 10 daha hızlı. Yaşasın. –

cevap

2

Valgrind görünüyor altında gccgo oluşturulan ikili Koşu gccgo'un verimsiz bir bellek ayırıcısına sahip olduğunu belirtmek için. Bu, gccgo 4.7.2'nin go 1.0.2'den daha yavaş olmasının nedenlerinden biri olabilir. Git 1.0 tarafından üretilen bir ikili çalıştırmak mümkün değildir.Valgrind altında 2, bu durumda bellek tahsisi gccgo birincil performans sorunu olup olmadığını bir gerçeği teyit etmek zordur.

+0

Valgrind’den söz ettiğiniz için teşekkür ederiz. Bu benim ilk defa profilleme yaparken kazandım ve gprof profiler olsa da ... yanılmışım :) Ancak, 'Valgrind''in bir C-profiler/profil oluşturma çerçevesi olduğu görülüyor. Başlatılmamış değerler hakkında şikâyet ediyor ve "get" diye bir şey yapmıyor gibi görünüyor ... Biraz detaylandırır mısınız? –

+0

Gccgo tarafından oluşturulan kodun davranışını incelemek için 'valgrind --tool = callgrind' ve KCacheGrind kullanmıştım. Valgrind'in callgrind'i aynı zamanda C-olmayan kodların çoğunu çalıştırabilir, ancak ne yazık ki, go1.0.2 tarafından üretilen ikili dosyalar tarafından ihlal edilen varsayımlar yapmaktadır. https://code.google.com/p/go/issues/detail?id=782 –

0

go build aynı zamanda varsayılan değerlerin statik bağlamaya dayandığından, elma ile elma arasındaki karşılaştırma için gccgo değerini -static veya -static-libgo seçeneklerine vermeniz gerekir.

İlgili konular