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
:
Bengccgo
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
İ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. –
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 :) –
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. –