Go neden bu kadar yavaş (Java'ya kıyasla)?


109

2010'da The Computer Language Benchmarks Game'de görebileceğimiz gibi :

  • Go, C'den ortalama 10 kat daha yavaştır
  • Git daha yavaş 3x olan Java !?

Go derleyicisinin yürütme için yerel kod ürettiğini göz önünde bulundurarak bu nasıl olabilir?
Go için olgunlaşmamış derleyiciler mi? Veya Go diliyle ilgili bazı temel sorunlar mı var?

DÜZENLEME:
Çoğu yanıt, sorunun olgunlaşmamış derleyicilerde olduğunu iddia ederek Go dilinin içsel yavaşlığını reddeder.
Bu nedenle Fibonacci sayılarını hesaplamak için bazı testler yaptım : Yinelemeli algoritma Go'da (freebsd, 6g) sameC'deki hızda (O3 seçeneğiyle) çalışır. Donuk özyinelemeli, Go'da 2 timesC'den daha yavaş çalışır (-O3 seçeneğiyle; -O0 ile - aynı). Ama Benchmark Game'deki gibi 10x düşüş görmedim.


36
Adil olmak gerekirse, C kılık değiştirmiş ASM'dir ve Java'nın bu günlerde bazı ciddi optimizasyonları var.
Matthew Scharley

16
Belki de kriter aynı zamanda Go'nun güçlü yönlerini yansıtmamaktadır. Diğer ölçütler aslında bundan daha hızlı olabilir. Ayrıca, çoğu zaman en önemli olan kodun performansı değil okunabilirliğidir.
extraneon

7
@ extraneon: Katılıyorum. Go'nun Google için tasarlandığını ve Google'ın rutin olarak 2 milyon çekirdek üzerinde kod çalıştırdığını unutmayın . Benchmarks Game'in sadece 4 çekirdek kullandığına inanıyorum.
Jörg W Mittag

4
@ extraneon: Genel olarak katılıyorum, ancak Go, "sonuçta ortaya çıkan programlar neredeyse karşılaştırılabilir C veya C ++ kodu kadar hızlı çalışır" gibi özellikle hız düşünülerek tasarlandı.
shosti

4
Sorunuz çok fazla varsayıyor: "Cevapların çoğu Go dilinin içsel yavaşlığını reddediyor" bir soruda kullanmak için yanlış bir ifadedir. Sormanız gereken bir sorunuz veya yapmanız gereken bir açıklama mı var? Hatanızı anlamak için lütfen c2.com/cgi/wiki?HostileStudent adresine bakın .
Chris

Yanıtlar:


102

6g ve 8g derleyicileri özellikle optimize etmiyor, bu nedenle ürettikleri kod özellikle hızlı değil.

Hızlı bir şekilde kendileri çalışacak ve sorun olmayan kod üretecek şekilde tasarlandılar (biraz optimizasyon var). gccgoGCC'nin mevcut optimizasyon geçişlerini kullanır ve C ile daha anlamlı bir karşılaştırma sağlayabilir, ancak gccgo henüz özellik tamamlamamıştır.

Kıyaslama rakamları neredeyse tamamen uygulama kalitesiyle ilgilidir. Uygulamanın, kıyaslamanın gerçekten ihtiyaç duymadığı dil özelliklerini destekleyen çalışma zamanı harcaması haricinde, dil ile çok fazla ilgisi yoktur. Derlenen çoğu dilde, yeterince zeki bir derleyici teoride neyin gerekmediğini çıkarabilir, ancak demoyu bozduğunuz bir nokta vardır, çünkü dilin çok az gerçek kullanıcısı bu özelliği kullanmayan programlar yazacaktır. . Nesneleri tamamen kaldırmadan uzaklaştırmak (örneğin, JIT ile derlenmiş Java'da sanal çağrı hedeflerini tahmin etmek) zorlaşmaya başlar.

FWIW, Go ile yaptığım çok önemsiz testim ona bir göz atarken (temelde bir tamsayı toplama döngüsü), gccgo, C arasındaki aralığın hızlı sonuna doğru gcc -O0ve gcc -O2eşdeğer C için kod üretti . Go doğası gereği yavaş değil, ancak derleyiciler henüz her şeyi yapmıyor. 10 dakikalık bir dil için pek şaşırtıcı değil.


7
Ayrıca, The Computer Language Benchmarks Game'deki Go programları, C ve Java gibi optimize edilmemiş olabilir.
el.pescado

Gcc -O0 ve gcc -O3 arasında ne var? Derleyicilerin "her şeyi yapması" niyeti bile var mı?
igouy

@igouy: gccgo'nun şu anda yapmadığı gibi çöp toplama işlemi yapacağına dair bir niyet olduğundan oldukça eminim. Yine de g derleyicilerine girecek bazı özellikler vardır, örneğin şu anda ana bilgisayar iş parçacıklarını özellikle iyi kullanmamaktadırlar (özellikle, gorutin zamanlayıcı önceden değildir). Bunun ötesinde, Google'ın planlarını, g derleyicilerinin şiddetli bir şekilde optimize edip etmeyeceğini veya sadece gccgo'nun yapıp yapmayacağını bilmiyorum.
Steve Jessop

1
@xitrium: Bence Go'nun amacı, uygulamaların işbirliği içinde planlanmasına gerek olmaması, isterlerse ön-boşaltma yapabilmeleri. Örneğin , "saçma, bu sözde hatayı düzeltmek Go dili tanımıyla çelişir" olarak kapatılmamış olan kod.google.com/p/go/issues/detail?id=543 örneğine bakın. Go uygulamalarının önceden boşaltılması yasaktır :-) Sorun, Go'nun varsayılan olarak kaç tane gorutinin çalıştırılabilir olduğuna bakılmaksızın yalnızca tek bir ana bilgisayar iş parçacığı kullanması gerçeğiyle birleşti.
Steve Jessop

6
Cevap şu an için biraz modası geçmiş olabilir. Son zamanlarda Go 1.1'in ilk beta sürümü yayınlandı , derlenen programların performansının yaklaşık% 30 ila% 40 arttığını belirtiyorlar. Biri lütfen bu testleri tekrar yapsın.
2013

51

Go SSS'nin bir sonraki sürümünde , aşağıdakine benzer bir şey görünmelidir.

Verim

Go, X karşılaştırmasında neden kötü performans gösteriyor?

Go'nun tasarım hedeflerinden biri, karşılaştırılabilir programlar için C'nin performansına yaklaşmaktır, ancak bazı kıyaslamalarda, test / bench'teki birkaçı da dahil olmak üzere, oldukça zayıftır. En yavaş olanı, karşılaştırılabilir performansın sürümlerinin Go'da mevcut olmadığı kitaplıklara bağlıdır. Örneğin, pidigitler çok duyarlıklı bir matematik paketine bağlıdır ve Go'nun aksine C sürümleri GMP kullanır (optimize edilmiş derleyicide yazılmıştır). Normal ifadelere (örneğin regex-dna) dayanan karşılaştırmalar, esasen Go'nun stopgap regexp paketini PCRE gibi olgun, yüksek düzeyde optimize edilmiş düzenli ifade kitaplıklarıyla karşılaştırmaktadır.

Kıyaslama oyunları kapsamlı ayarlamalarla kazanılır ve kıyaslamaların çoğunun Go sürümleri dikkat gerektirir. Karşılaştırılabilir C ve Go programlarını ölçerseniz (ters tamamlama bir örnektir), iki dilin ham performansta bu paketin gösterdiğinden çok daha yakın olduğunu göreceksiniz.

Yine de, iyileştirme için yer var. Derleyiciler iyidir ancak daha iyi olabilir, birçok kitaplık büyük performans çalışmasına ihtiyaç duyar ve çöp toplayıcı henüz yeterince hızlı değildir (öyle olsa bile, gereksiz çöp üretmemeye özen göstermenin çok büyük bir etkisi olabilir).

Ve Bilgisayar Kıyaslama Oyunu ile ilgili bazı ayrıntılar yakın tarihli bir posta listesi .

Gccgo'da çöp toplama ve performans (1)

Gccgo'da çöp toplama ve performans (2)

Bilgisayar Kıyaslama Oyunu'nun sadece bir oyun olduğuna dikkat etmek önemlidir. Performans ölçümü ve kapasite planlamasında tecrübeli kişiler, gerçekçi ve gerçek iş yükleri üzerindeki benzerlerle dikkatli bir şekilde eşleşir; oyun oynamıyorlar.


1
Ve burada, aynı ileti dizisinden hariç tuttuğunuz bazı ayrıntılar - groups.google.com/group/golang-nuts/msg/2e568d2888970308
igouy

3
"Kıyaslama ölçütlerinin sadece bir test oyunu olarak yayınlanan ölçütler değil" olduğuna dikkat etmek önemlidir - shootout.alioth.debian.org/flawed-benchmarks.php
igouy

18
(ve herkes ...) Elbette bu bir "oyun" , ancak Go'nun bu kıyaslamalardaki en hızlı olandan yalnızca iki kat daha yavaş olduğunu gördüğümde, ilk izlenimim "vay be, Go hızlı görünüyor" çünkü bu kriterlerin kusurlu. Aksine, Ruby'nin en hızlıdan 65 kat daha yavaş olduğunu gördüğümde, kendi kendime "Ruby'yi bir sonraki eşzamanlı sayısal olarak yoğun çabam için kullanmayacağımı" düşünüyorum . Yani bu bir "oyun" olabilir, ancak biraz tuzla alırsanız, içinde bazı gerçekler var.
SözdizimiT3rr0r

Kapasite planlamasının çok önemli bir yönü vardır: maliyet. X box'a mı yoksa 2 * X'e mi ihtiyacınız olacak, sonunda büyük bir fark yaratır. Ve hiç kimse gelecekte bunlarda neyin çalışacağını tam olarak tahmin edemeyeceğinden, en iyi bahis farklı iş yüklerine bakmaktır. Bunların birkaç uygulamasını kontrol ettim ve çoğunlukla iyi olduklarını gördüm. Sonuçların tahminler için bir temel olarak kullanılabileceğini düşünüyorum.
Agoston Horvath

Genel olarak, gerçek dünya sistemleri CPU ile değil IO tarafından kısıtlanır. Bu nedenle, Go'nun 2x veya 5x daha yavaş olması, yük devretme, yük dengeleme, önbelleğe alma, veritabanı topolojisi ve benzeri gibi kapasite planlamasında pek fark yaratmaz. Bu nedenle, YouTube ölçeğindeki uygulamalar, sistemlerinin çoğunu Python'da çalıştırabilir.
Sujoy Gupta

34

Cevabım herkes kadar teknik değil, ancak yine de alakalı olduğunu düşünüyorum. Go öğrenmeye karar verdiğimde Bilgisayar Benchmark Game'de de aynı kriterleri gördüm. Ancak dürüst olmak gerekirse, tüm bu sentetik kıyaslamaların Go'nun sizin için yeterince hızlı olup olmadığına karar vermede anlamsız olduğunu düşünüyorum.

Geçenlerde Tornado + TornadIO + ZMQ kullanarak Python'da bir mesaj sunucusu yazmıştım ve ilk Go projem için sunucuyu Go'da yeniden yazmaya karar verdim. Şimdiye kadar, sunucuyu Python sürümüyle aynı işlevselliğe getirdikten sonra, testlerim bana Go programında yaklaşık 4,7 kat hız artışı gösteriyor. Unutmayın, Go'da yalnızca bir haftadır kod yazıyorum ve 5 yıldan fazla bir süredir Python'da kod yazıyorum.

Go, yalnızca üzerinde çalışmaya devam ettikçe hızlanacak ve bence asıl mesele, küçücük hesaplama ölçütleri yerine gerçek dünya uygulamasında nasıl performans gösterdiğine bağlı. Benim için Go, benim Python'da üretebileceğimden daha verimli bir programla sonuçlandı. Bu sorunun cevabını benim yorumum budur.


3
Go kodunu Python'dan ne kadar daha yavaş yazacağınızı düşünüyorsunuz?
Erik Engheim

7
@AdamSmith - Go kodunu Python'dan daha yavaş yazacağımı söyleyebilirim çünkü 7+ yıldır Python'u kodluyorum ve sadece biraz Go. Ancak Go ve diğer statik olarak yazılmış, derlenmiş diller açısından, Go'yu diğerlerinden daha hızlı yazacağıma bahse girerim. Şahsen, C ve C ++ arasındaki hızda Python'un sadeliğine en yakın şey olduğunu hissediyorum
jdi

5
Benzer bir hikayem var. Go öğrenmeye yeni başladım ve Benchmarks Game'e göre Go, JavaScript V8'den DAHA YAVAŞ. İkili işlemlerin yoğun olduğu programımın, yüksek düzeyde optimize edilmiş V8 sanal makineye göre optimize edilmemiş Go koduyla 10 kat daha hızlı çalıştığı ortaya çıktı. Go, birçok işlemde C'den daha yavaş olabilir, ancak kimse C'de web sitesi yazmamaktadır. Go, halihazırda mükemmel bir şekilde uygulanabilir bir seçenektir ve yeni kütüphaneler, çerçeveler ve araçlar açıldığında yalnızca daha iyi hale gelmelidir.
__name__ Yok ise

1
@ user962247 bu çılgın ve yanlış bir battaniye ifadesidir. Yıllardır Go yazıyorum ve çok hızlı. Mümkün olan her sentetik kıyaslamada C / C ++ / Java'yı yeneceğini kimse iddia etmez. Ancak bazılarında kazanır (kıyaslama oyun sitesine bakın). Bunu yıllardır üretim Go kodu yazan birinden alın. Hızlı ve üretken.
jdi


6

İşler değişti.

Bence sorunuza şu anki doğru cevap, yavaş giden fikre itiraz etmek. Soruşturmanız sırasında kararınız haklıydı, ancak o zamandan beri performans açısından çok fazla zemin kazandı. Şimdi, hala C kadar hızlı değil, ancak genel anlamda 10 kat daha yavaş olmaya hiç yakın değil.

Bilgisayar dili kıyaslama oyunu

Bu yazının yazıldığı sırada:

source  secs    KB      gz      cpu     cpu load

reverse-complement
1.167x
Go      0.49    88,320  1278    0.84    30% 28% 98% 34%
C gcc   0.42    145,900 812     0.57    0% 26% 20% 100%

pidigits
1.21x
Go      2.10    8,084   603 2.10    0% 100% 1% 1%
C gcc   1.73    1,992   448 1.73    1% 100% 1% 0%

fasta
1.45x
Go      1.97    3,456   1344    5.76    76% 71% 74% 73%
C gcc   1.36    2,800   1993    5.26    96% 97% 100% 97%

regex-dna
1.64x
Go      3.89    369,380 1229    8.29    43% 53% 61% 82%
C gcc   2.43    339,000 2579    5.68    46% 70% 51% 72%

fannkuch-redux
1.72x
Go      15.59   952 900 62.08   100% 100% 100% 100%
C gcc   9.07    1,576   910 35.43   100% 99% 98% 94%

spectral-norm
2x
Go      3.96    2,412   548 15.73   99% 99% 100% 99%
C gcc   1.98    1,776   1139    7.87    99% 99% 100% 99%

n-body
2.27x
Go      21.73   952 1310    21.73   0% 100% 1% 2%
C gcc   9.56    1,000   1490    9.56    1% 100% 1% 1%

k-nucleotide
2.40x
Go      15.48   149,276 1582    54.68   88% 97% 90% 79%
C gcc   6.46    130,076 1500    17.06   51% 37% 89% 88%

mandelbrot
3.19x
Go      5.68    30,756  894 22.56   100% 100% 99% 99%
C gcc   1.78    29,792  911 7.03    100% 99% 99% 98%

Yine de, ikili ağaç kıyaslamasında acımasızca acı çekiyor:

binary-trees
12.16x
Go      39.88   361,208 688 152.12  96% 95% 96% 96%
C gcc   3.28    156,780 906 10.12   91% 77% 59% 83%

Şimdi Java ile aynı, ancak Go aynı şeyler için kullanılırken (sunucu tarafı ağ uygulamaları) Java'dan daha hızlı olması için açıkça yaratılmadı mı?
MaxB

1
@MaxB hayır, Java'dan daha hızlı olma amacıyla yaratılmadı. Geliştiricilerin daha üretken olmasını sağlamak için iyi performans, C ++ 'dan daha hızlı derleme ve daha kolay ve yerel eşzamanlılığa sahip olmak amacıyla oluşturuldu. Diğer dillerin çalışma süresi hızını yenmek itici bir faktör değildi.
jdi

5

Go'nun CPU döngüleri kullanımıyla ilgili çok iyi olmayan verimliliğine rağmen, Go eşzamanlılık modeli, örneğin Java'daki iş parçacığı modelinden çok daha hızlıdır ve C ++ iş parçacığı modeliyle karşılaştırılabilir.

İçinde olduğunu unutmayın parçacığı halka kriter , Go oldu 16x daha hızlı Java daha. Aynı senaryoda Go CSP, neredeyse C ++ ile karşılaştırılabilirdi, ancak 4 kat daha az bellek kullanıyordu.

Go dilinin büyük gücü, 70'lerde Tony Hoare tarafından belirlenen, uygulaması basit ve eşzamanlı ihtiyaçlara uygun olan eşzamanlılık modeli olan İletişim Sıralı Süreçler, CSP'dir.


2

Java'nın Go ve C ++ 'dan daha hızlı olmasının ve birçok durumda C'den daha hızlı olmasının iki temel nedeni vardır:

1) JIT derleyicisi. Sanal işlev çağrılarını, çalışma zamanı profiline bağlı olarak OO sınıflarında bile birden çok düzeyde satır içi yapabilir. Bu, statik olarak derlenen bir dilde mümkün değildir (kaydedilen profile dayalı yeni yeniden derleme yardımcı olabilirse de). Bu, tekrarlayan algoritmalar içeren çoğu kıyaslama için çok önemlidir.

2) GC. GC tabanlı bellek tahsisi, malloc ile karşılaştırıldığında neredeyse ücretsizdir. Ve 'ücretsiz' ceza, tüm çalışma süresi boyunca amortismana tabi tutulabilir - genellikle atlanır çünkü program, tüm çöplerin toplanması gerekmeden önce sona erer.

GC / JVM'yi verimli kılan yüzlerce (binlerce?) Son derece yetenekli geliştirici vardır. "Hepsinden daha iyi kod yazabileceğinizi" düşünmek aptallıktır. Bu, özünde bir insan egosu problemidir - insanlar, yetenekli insanlar tarafından uygun bir eğitimle bilgisayarın onu programlayan insanlardan daha iyi performans göstereceğini kabul etmekte zorlanırlar.

Btw, C ++, OO özelliklerini kullanmazsanız C kadar hızlı olabilir, ancak başlamak için C ile programlamaya oldukça yakınsınızdır.

En önemlisi, bu testlerdeki "hız farklılıkları" genellikle anlamsızdır. IO maliyetleri, performans farklılıklarından daha büyük siparişlerdir ve bu nedenle IO maliyetlerini en aza indiren uygun tasarımlar her zaman kazanır - yorumlanmış bir dilde bile. Çok az sistem CPU'ya bağlıdır.

Son bir not olarak, insanlar "bilgisayar dili kıyaslama oyunundan" "bilimsel bir önlem" olarak bahsediyorlar. Testler tamamen kusurludur, Örneğin, nbody için Java testlerini görüntülerseniz. Testleri aynı işletim sistemi / donanım üzerinde çalıştırdığımda, Java için yaklaşık 7,6 saniye ve C için 4,7 saniye alıyorum - ki bu mantıklı - testlerin rapor ettiği 4 kat yavaşlık değil. Site trafiğini oluşturmak için tasarlanmış tıklama tuzağı, sahte haberlerdir.

Son, son bir not olarak ... Testleri Go kullanarak çalıştırdım ve 7,9 saniyeydi. Git'e tıkladığınızda, onu Java ile karşılaştırması ve Java'ya tıkladığınızda C ile karşılaştırması, herhangi bir ciddi mühendis için kırmızı bayrak olmalıdır.

Java, Go ve C ++ arasında gerçek bir dünya karşılaştırması için bkz. Https://www.biorxiv.org/content/10.1101/558056v1 spoiler uyarısı, Java ham performansta zirveye çıkıyor ve Go, kombine bellek kullanımıyla zirveye çıkıyor ve duvar saati.


yanlış. C ++, C kadar hızlıdır, özellikle OOP kullandığınızda, bu onun doğum sertifikasıdır. SIFIR EKSTRA BYT BELLEK İLE HERHANGİ BİR ÇALIŞMA SÜRESİ PERFORMANS BOZULMASI OLMADAN daha fazla soyutlama (sınıflarda olduğu gibi). Bunu bilmiyorsanız, java, c #, go, python, vb. ile

// Btw, C ++, OO // özelliklerini kullanmazsanız C kadar hızlı olabilir, ancak başlamak için sadece C // ile programlamaya oldukça yakınsınız. eğer öyle diyorsan, c ++ hakkında çok az fikrin var, kendi iyiliğin için kullanmayın. c ve c ++ sihir ve ortaçağ zihinlerinden nefret ediyor, doğası gereği batıl inançlar var, sanki bunu duydum, internet üzerinden okuyun, doğru olmalı ... c ve c ++ 'dan uzak durun, sizi geri çevirecekler arkadaşım (dürüst tavsiye)

c, c ++ 'nın atasıdır. birçok insan hala kullanıyor ... c ++, bedelini ödemeden daha fazlasını yapabileceğiniz daha iyi bir c'dir. java, c # and go yazarları anlamadı, tabii ki, yaptılar, ama ne yapabilirler?!? mevcut (c) koduyla uyumlu olmakla aynı. c kodunun gerçek hayat okyanusları! python güzel bir oyuncak, keyfini çıkarın, keşke doğru yapsalar, ama nah, python zen "compiler is your friend" ile

>> Java programı için% 30 CPU kullanımını gösterir << Hayır —— "1% 0% 0% 100%".
igouy

1
@igouy Bunun muhtemelen yaptığım bir hata olduğunu kabul ediyorum - yükü gördüğümde, 'sistem yükü' terimleriyle yorumluyordum ve kullanıcı / sistem / io / boşta olduğunu varsayıyorum - benim hatamdı ve bu önemli bir hataydı.
robert engels

1

Bence sıklıkla gözden kaçan bir gerçek, JIT derlemesinin özellikle (çalışma zamanı) geç bağlanmış işlevler veya yöntemler için statik derleme olabileceğidir. Hotspot JIT, RUNTIME'de hangi yöntemlerin sıralı olacağına karar verir, hatta veri düzenini şu anda üzerinde çalıştığı CPU'nun önbellek boyutuna / mimarisine ayarlayabilir. Genel olarak C / C ++, donanıma doğrudan erişim sağlayarak telafi edebilir (ve genel olarak daha iyi performans gösterecektir). Go için işler, C'ye kıyasla daha yüksek seviyeli olduğu için farklı görünebilir, ancak şu anda bir çalışma zamanı optimizasyon sistemi / derleyicisi yok. İçgüdülerim bana, Go'nun işaretçi kovalamasını bu kadar çok zorlamadığı ve daha iyi veri yapısı yerelliğini teşvik ettiği için Go Java'dan daha hızlı olabileceğini söylüyor + daha az tahsis gerektiriyor.


1

Aslına bakılırsa, Go yalnızca tasarım zamanında zarif ve verimli olmakla kalmaz, aynı zamanda çalışma zamanında da süper performans gösterir. Anahtar, doğru işletim sistemini, yani LINUX'u kullanmaktır. Windows ve Mac OS altında performans profili oluşturma sonucu, daha iyi bir kelime olmadığı için, bir veya iki büyüklük sıralaması daha düşüktür.


0

linux altında, go çalışma zamanı süper hızlıdır, c / c ++ ile mükemmel bir şekilde karşılaştırılabilir. windows altındaki go çalışma zamanı ve unix aynı ligde değil

java ile karşılaştırma çok önemli değil, go hem sistem hem de uygulama geliştirme içindir (çünkü java yalnızca uygulama geliştirme için mavi yakaya benzer). ayrıntılara girmeyecek, ancak kubernetes gibi şeyler yazıldığında, bunun kurumsal danışman dostu bir oyuncak olmadığını anlıyorsunuz.

Google'ın bahsettiğiniz uzlaşmadan bir kez bile bahsettiğini hatırlamıyorum. go iyi bir tasarıma sahiptir, basit, zarif ve etkilidir, sistem ve uygulama seviyesi programları tasarlamak için işaretçiler, verimli bellek ayırma ve serbest bırakma içerir, kullanımı çok kolay olan uygulama kalıtımından kaynaklanan komplikasyonları önler, size ortak rutinler ve diğer modernler sunar Zaman ve bütçe dahilinde yüksek performanslı uygulamalar yazmanın yolları. yine, go linux altında süper hızlıdır, tam olarak bunun için tasarlandığı şeydir (yaptığı için çok mutluyuz)


-4

Hem Java hem de C, verileri ve yöntem (işlev) tanımlarıyla daha belirgindir. C statik olarak yazılmıştır ve Java kalıtım modelinde daha azdır. Bu, verilerin işlenme şeklinin derleme sırasında hemen hemen tanımlandığı anlamına gelir.

Go, verileri ve işlev tanımlarıyla daha örtülüdür. Yerleşik işlevler doğası gereği daha geneldir ve bir tür hiyerarşisinin olmaması (Java veya C ++ gibi) Go'ya hızlı bir dezavantaj sağlar.

Google'ın Go dili için hedefinin, yürütme hızı ve kodlama hızı arasında kabul edilebilir bir uzlaşmaya sahip olmak olduğunu unutmayın. Bence erken girişimlerinde iyi bir noktaya ulaşıyorlar ve işler ancak daha fazla iş yapıldıkça iyileşecek.

Go'yu, ana avantajı kodlama hızı olan daha dinamik olarak yazılmış dillerle karşılaştırırsanız, Go'nun yürütme hızı avantajını göreceksiniz. Go, perl'den 8 kat, Ruby 1.9 ve Python 3'ten 6 kat daha hızlıdır.

Her neyse sorulması gereken daha iyi soru, Go'nun programlama kolaylığı ile yürütme hızı arasında iyi bir uzlaşma olması mı? Cevabım evet ve daha iyi olmalı.


20
"tür hiyerarşisinin olmaması (Java veya C ++ gibi) Go'ya hız açısından bir dezavantaj sağlar" —wut?
Erik Kaplun

6
"Go, verileri ve işlev tanımlarıyla daha örtük." Yanlış. Türlerin, açıklanmadan yöntemleri nasıl uygulayabileceğini mi kastediyorsunuz? Derleyici, tür - arabirim üyeliğini algılar. Bu hızlı. "Yerleşik işlevler doğası gereği daha geneldir" hayır, yerleşikler her şey gibi derlenmiştir. C ++ şablonlarında da aynı şey olur. "tür hiyerarşisinin olmaması (Java veya C ++ gibi) Go'ya hız dezavantajı sağlar" - yanlış, bir tür hiyerarşisinin çalışma zamanı yürütmeyle ilgisi yoktur.
Malcolm
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.