Go ne kadar hızlı gidebilir?


39

Go, 'metale yakın' olması gereken birkaç dilden biridir, yani derlenir, statik olarak yazılır ve yerelde bir VM olmadan kod yürütür. Bu, Java, C # ve benzerlerine göre hız avantajı sağlamalıdır. Bununla birlikte, Java'nın arkasında olduğu görülüyor (bkz. Programlama Dili Çekilmesi )

Daha az olgun derleyicilerin bundan büyük ölçüde sorumlu olduğunu farz ediyorum, fakat başka nedenler var mı? Go'nun tasarımında, Java'dan daha hızlı çalışmasını engelleyecek herhangi bir şey var mı? Çalışma zamanı modelleri hakkında çok karmaşık bir görüşüm var, ancak yerel kod uygulaması sayesinde en azından prensipte Java'dan daha hızlı çalışabilmesi gerektiği görünüyor.


3
Yeterince akıllı bir derleyici (ve / veya VM ve / veya JIT-derleyici) göz önüne alındığında, verilen bir dil her zaman daha hızlı gidebilir (peki, fiziksel sınırlamalar var, ama bu kadar). Elbette bu gerçekçilik, yeterince akıllı bir derleyici var olmadığı sürece kimseye yardımcı olmaz. Java’nın zaten yeterince akıllı uygulamalara sahip olduğunu ve inanılmaz derecede akıllı olduklarını unutmayın . Yaşamın bir başka gerçeği, kod çalıştırmasının en azından uygulama zamanı gibi çalışma zamanı performansını etkilemesidir.

1
Bunu anlıyorum ama Go'nun hızını arttırması için örneğin Java'nın eşleşmesini / geçmesini beklemenin makul olup olmadığını merak ediyordum.
Greg Slodkowicz

17
Programlama dillerinin hızı yoktur. Dil uygulamaları da yoktur. Belirli bir dil uygulamasının bazı girdiler için bir hızı vardır ve bu hız girdilere bağlı olarak çok fazla olabilir.

8
Beni uyandır .. gitmeden önce ... WHAM! . Üzgünüm, karşı koyamadım. İşte bayraklar geliyor .. burada bayraklar geliyor ..
Tim Post

2
@delnan - Yoksa "Java" demek, "Java (TM) SE Çalışma Zamanı Ortamı (derleme 1.6.0_25-b06)" Java HotSpot (TM) 64-Bit Sunucu VM (derleme 20.0-b11) demekten daha kolay mı , karma mod) ":-)
igouy

Yanıtlar:


46

Dil tasarımı açısından, Go'yu genel olarak Java'dan daha yavaş yapması gereken hiçbir şey yoktur. Aslında, veri yapılarınızın bellek düzenini daha fazla kontrol etmenizi sağlar, bu yüzden birçok ortak görev için biraz daha hızlı olması gerekir. Bununla birlikte, mevcut birincil Go derleyicisi, zamanlayıcı, çöp toplayıcı, regexp kütüphanesi ve daha pek çok şey özellikle optimize edilmemiştir. Bu istikrarlı bir şekilde gelişiyor, ancak odak noktası, mikro markalarda kazanma konusunda faydalı, basit ve yeterince hızlı olma gibi görünüyor.

Bağlantılı kıyaslamada Go, ikili ağaçtaki ve regexp testindeki Java'ya büyük kaybetti. Bunlar sırasıyla bellek yönetim sistemi ve regexp kütüphanesinin testleridir. Go'nun hafıza yönetimi daha hızlı olabilir ve zaman içinde kesinlikle gelişebilir ve mevcut standart regexp kütüphanesi, yakında daha iyi bir uygulama için yer tutucudur. Bu nedenle, bu ikisini kaybetmek şaşırtıcı değildir ve yakın gelecekte bu sınırın daha dar olması gerekir.

K-nükleotid kıyaslaması için, karşılaştırılması biraz zor çünkü Java kodu farklı bir algoritma kullanıyor gibi görünüyor. Go kodu kesinlikle, derleyici, programlayıcı ve tahsis edilen geliştirmelerden faydalanacaktır, yazılı olarak bile olsa, ancak birileri daha doğru bir şekilde karşılaştırmak istiyorsak, daha akıllıca bir şey yapmak için Go kodunu yeniden yazmak zorunda kalacaktır.

Java, mandelbrot benchmarkında kazanıyor çünkü hepsi kayan nokta aritmetik ve döngüler, ve bu JVM'nin gerçekten iyi bir makine kodu üretmesi ve çalışma zamanında işleri kaldırması için harika bir yer. Go, buna karşılık, şu anda gerçekten sıkı bir makine kodu kaldırmayan, açmayan ya da açmayan oldukça basit bir derleyiciye sahip, bu yüzden kaybedeceği şaşırtıcı değil. Bununla birlikte, Java zamanlamasının JVM başlatma zamanını veya JVM'nin JIT'yi güzel bir şekilde JIT'e çevirmesi için çalıştırılması gereken zamanları saymadığı unutulmamalıdır. Uzun süren programlar için bu önemli değildir, ancak bazı durumlarda önemlidir.

Kriterlerin geri kalan kısmında ise Java ve Go temelde ense boyunda, Go daha belirgin ve daha az kod alıyor. Bu nedenle, Go bu testlerin bir kısmında Java'dan daha yavaş olsa da, Java oldukça hızlı, Go karşılaştırmaya göre oldukça iyi durumda ve Go muhtemelen yakın gelecekte çok daha hızlı olacak.

Gccgo'nun (gcc codegen'i kullanan bir Go derleyicisi) olgunlaştığını dört gözle bekliyorum; Bu Go'yu C ile aynı kodda tutacaktır.


2
Aferin, her zaman kaynak koduna bakmanın ve ne yapıldığını kontrol etmenin gerekli olduğunu anlamak için!
igouy

1
Bu programlar için Java başlangıç saatinde, bkz shootout.alioth.debian.org/help.php#java
igouy

2
Bu tam olarak umduğum cevap türü, teşekkürler!
Greg Slodkowicz

Çok daha az kod ve bellek kullanımı, daha iyi tasarlanmış, makine koduna derler. Bütün bunlar hız dezavantajını devralıyor.
Moshe Revah

22
  1. Hangi problemlerin çözüldüğünü söylemeden bile, tüm ölçüt anlamsızdır.
  2. JVM ve CLR, makine kodu üretmek için JIT’leri kullanır. Bunun daha yavaş olması için hiçbir sebep yok. Bu sadece önyükleme için yaş alır.
  3. Go hızlı inşa etmek için tasarlandı . Tonlarca derleme ve önyükleme süresi optimizasyonlarına sahip değilsiniz. Go, bir Java uygulamasının başlatıldığı zamanki kendi standart kütüphanesini derler.

Go çalışma zamanında daha hızlı olabilir mi? Evet. Go çalışma zamanında daha hızlı olacak mı? Bilmiyorum. Belki derleyici üreticileri derleme zamanı pahasına isteğe bağlı optimizasyon ekleyecektir. Ancak buna fazla ilgi gösterdiklerini sanmıyorum. Google’da çalışıyorlar.
İstedikleri şey hızlı gelişime izin veren ve yaptıkları işte iyi performans gösteren bir dildir. Cehennem, bu kriter güvenilir olsa bile, onların C kadar yarı, Python kadar 14 kat daha hızlı oldukları anlamına geliyor. Bu yeterince iyi.
Donanım ucuz, kod pahalı. Kod, yatırım yaptığınız zaman daha büyük ve daha yavaş olma eğilimindedir, donanım daha ucuz ve daha küçük hale gelir. Yararlı bir şey yapmak için 4 çerçeve ve 2000 sınıfı gerektirmeyen bir dil istiyorsunuz.
Go'nun tasarımında doğal olan hiçbir şey yok, bu onu yavaşlatıyor. Bununla birlikte, Go'nun tasarımcılarında doğası gereği, montajdan daha yavaş yapan bir şey var: sağduyu.


1
Çoğu (tümü?) JIT, kod ilk yüklendiğinde çalışma zamanı sırasında derlenir. Bu makine kodu bazı kod için hiç oluşturulabilir değil ve eğer da kolayca örneğin geçersiz edilebilir objsiçinde for (obj : objs) { obj.meth() }farklı uygulamaları var methzaten iç için her zaman ve JIT denemeden. Tabii ki, bütün bunlar aslında ortak davalarda bir fayda , ancak yine de not edilebilir.

@delnan: V8 JIT çalıştırmadan önce herhangi bir kodu yazar. Ayrıca, LLVM akılda JITting ile inşa edilmiştir, bu nedenle (elbette biraz çaba ile) derhal zamanında olacak olan tam zamanında herhangi bir optimizasyon yapabilirsiniz. Ancak, kaçış analizi gibi bazı optimizasyonlar yalnızca gerçekten JIT'lerle çalışır.
back2dos

3
>> Hangi problemlerin çözüldüğünü bile söylemeden << Bakın ve web sayfalarının DO'nun hangi problemlerin çözüldüğünü söylediğini göreceksiniz. Aslında, programın kaynak kodunu, komutları
oluştur

10

Ben de fark ettik Git özellikle yavaş olduğu regex-dna kriter. Russ Cox, Go'nun neden bu özel testte bu kadar başarılı olmadığını açıkladı . Bunun nedeni, Go'nun regexp paketinin, bu özel testte kötü performans gösteren farklı bir eşleştirme algoritması kullanmasıdır , ancak diğer testlerde daha hızlı olabilir . Ayrıca Ruby, Python ve diğer betik dilleri, başka bir regexp eşleştirme algoritmasının C uygulamasını kullanıyor .

Sonunda, Bilgisayar Dili Kriterleri Oyunu , ölçülen dillerin birçok özelliğini doğru şekilde yansıtmayacak ve hatta yanlış izlenimlere aracılık edebilecek mikro ölçütlerden oluşmaktadır. Google tarafından yakın zamanda yayınlanan bu araştırma makalesi, Go, Scala, Java ve C ++ 'nın çeşitli dil özelliklerine - özellikle "V. Performans Analizi" kısmına daha doğru bir genel bakış sunmaktadır . Böylece, sonuçta Go neredeyse Java kadar hafızada kaldı (Java'nın% 81'i) ve Scala'nın% 170 kadarını bile tüketiyor (gazetede JVM'nin bellek tüketiminin düşünüldüğü dikkate alınmadı).

Ancak yine, Go genç ve hala ağır gelişme altında (API değişiklikleri)! Yakında birçok gelişme olacak.


3
>> Son zamanlarda Google tarafından yayınlanan bu araştırma makalesi << Bu bir araştırma makalesi değildir ve Google tarafından yayınlanmamıştır. "Scala Days 2011" Scala atölyesinde sunulan bir Google çalışanı tarafından hazırlanan bir deneyim raporu.
igouy

>> ölçülen dillerin birçok özelliğini doğru bir şekilde yansıtmayabilir ve hatta yanlış izlenimlere aracılık edebilir. Aslında, yazar size “Çok iş parçacıklı ya da daha yüksek seviyeli tip mekanizmaların hiçbir yönünü
keşfetmiyoruz

@igouy Kapakta "Google" okuyabilir ve ilgili her şey ilgili referanslarla kaplıdır. Öyleyse neden Google'ın merkez adresinden bahsedilirse “Google tarafından yayınlanan bir araştırma makalesi” değildir? Araştırma makaleleri sadece bir akademik alan değil.
Alex,

Kapakta, yazarın sizinle iletişim kurabileceği posta adresini ve yazarın e-posta adresini okuyabilirsiniz. Gönderdiğiniz pdf’in URL’sini kontrol edin. Etki alanını not edin - days2011.scala-lang.org - Scala Days 2011 "Scala atölyesi.
igouy

1

Go Python'dan daha hızlı ve Java'dan biraz daha yavaş. Kaba deneyimlerim, Python'dan çok daha hızlı (1-2 büyüklük sırası) ve Java'dan% 10-20 daha yavaş olduğunu buldu. Bununla birlikte, Go dört çekirdekli (x64) ile kullanılırsa, Java'dan biraz daha hızlıdır. Go da RAM bellek açısından çok daha verimli.

Go'nun Java ve Python'a karşı performans potansiyeli hakkında bazı noktalar eklemek istiyorum. Go, sürekli olarak C'nin birçok dilden daha iyi performans göstermesine izin veren şeylere izin verir. Önbellek özlüyor, yüksek performans kodu önlemek için oldukça önemlidir. Önbellek eksikliğini azaltmak, veri yapılarınızın bellek düzenini kontrol etmenizi gerektirir. Git, bunu yapmana izin veriyor. Java, bellek ve önbellek kırılmasını önlemeyi zorlaştırmaz.

Şu anda Java genellikle Go'dan daha hızlı çalışır, çünkü Java çöp toplayıcısı çok daha karmaşıktır. Sebebi olmasa da, Go çöp toplayıcı çok daha iyi olamazdı. Kod oluşturma işlemi şu anda Java için muhtemelen çok daha iyi. Go, örneğin vektör talimatlarını destekleyen vb. İle iyileştirme potansiyeline sahiptir.

Bu yüzden Go'nun Java'yı geçmeden önce sadece bir zaman meselesi olduğunu düşünüyorum. Her ne kadar herhangi bir dil kodunda olduğu gibi Go'da yazılmakla otomatik olarak daha hızlı olmayacak. Dilin size sunduğu olanakları kullanmanız gerekiyor. Go'nun kodunuzu ayarlamak için daha fazla fırsat verdiğini söyleyebilirim.

Neyse, bu sadece bir geliştiricinin deneyimi.


4
Bu 8 yıllık bir sorudur ve ucuz bilişim gücü bu konuyla ilgisiz hale getirmiştir. Cevabınız aynı zamanda katı verilerden ziyade "hislerinize" dayanmaktadır. Seni cesaret kırmak
istemem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.