Warum ist Go so langsam (im Vergleich zu Java)?


109

Wie wir aus dem Computer Language Benchmarks Game im Jahr 2010 sehen konnten:

  • Go ist im Durchschnitt 10x langsamer als C.
  • Go ist 3x langsamer als Java !?

Wie kann dies sein, wenn man bedenkt, dass der Go-Compiler nativen Code zur Ausführung erzeugt?
Unreife Compiler für Go? Oder gibt es ein intrinsisches Problem mit der Go-Sprache?

BEARBEITEN:
Die meisten Antworten leugnen die intrinsische Langsamkeit von Go languge und behaupten, das Problem liege in unreifen Compilern.
Daher habe ich einige eigene Tests durchgeführt , um Fibonacci-Zahlen zu berechnen : Der iterative Algorithmus läuft in Go (freebsd, 6g) mit der sameGeschwindigkeit wie in C (mit O3-Option). Der langweilige rekursive läuft in Go 2 timeslangsamer als in C (mit der Option -O3; mit -O0 - das gleiche). Aber ich habe nicht 10x fallen sehen wie im Benchmarks-Spiel.


36
Um fair zu sein, C ist ASM in der Verkleidung, und Java hat heutzutage einige ernsthafte Optimierungen unter der Haube.
Matthew Scharley

16
Vielleicht spiegelt der Benchmark auch nicht die Stärken von Go wider. Es kann sein, dass andere Benchmarks tatsächlich schneller sind. Außerdem zählt oft nicht die Leistung, sondern die Lesbarkeit des Codes.
extraneon

7
@ Extraneon: Ich stimme zu. Denken Sie daran, Go wurde für Google entwickelt und Google führt routinemäßig Code auf 2 Millionen Kernen aus. Ich glaube, das Benchmarks-Spiel verwendet nur 4 Kerne.
Jörg W Mittag

4
@extraneon: Ich stimme im Allgemeinen zu, aber Go wurde speziell mit Blick auf die Geschwindigkeit entwickelt, wie in "Die resultierenden Programme werden fast so schnell ausgeführt wie vergleichbarer C- oder C ++ - Code."
Shosti

4
Ihre Frage setzt zu viel voraus: "Die meisten Antworten leugnen die intrinsische Langsamkeit von Go languge" ist eine falsche Formulierung für die Verwendung in einer Frage. Haben Sie eine Frage zu stellen oder eine Erklärung abzugeben? Weitere Informationen zu Ihrem Fehler finden Sie unter c2.com/cgi/wiki?HostileStudent .
Chris

Antworten:


102

Die 6g- und 8g-Compiler sind nicht besonders optimiert, sodass der von ihnen erzeugte Code nicht besonders schnell ist.

Sie sind so konzipiert, dass sie selbst schnell laufen und Code produzieren, der in Ordnung ist (es gibt ein bisschen Optimierung). gccgoVerwendet die vorhandenen Optimierungsdurchläufe von GCC und bietet möglicherweise einen aussagekräftigeren Vergleich mit C, aber gccgo ist noch nicht vollständig.

Bei den Benchmark-Zahlen geht es fast ausschließlich um die Qualität der Umsetzung. Sie haben nicht viel mit der Sprache als solcher zu tun, außer in dem Maße, in dem die Implementierung zur Laufzeit Sprachfunktionen unterstützt, die der Benchmark nicht wirklich benötigt. In den meisten kompilierten Sprachen könnte ein ausreichend cleverer Compiler theoretisch herausfinden, was nicht benötigt wird, aber irgendwann manipulieren Sie die Demo, da nur sehr wenige echte Benutzer der Sprache Programme schreiben würden, die diese Funktion nicht verwenden . Es wird schwierig, Dinge aus dem Weg zu räumen, ohne sie vollständig zu entfernen (z. B. Vorhersage virtueller Anrufziele in JIT-kompiliertem Java).

FWIW, mein eigener sehr trivialer Test mit Go, als ich ihn mir ansah (im Grunde genommen eine Schleife mit ganzzahligen Additionen), produzierte gccgo Code gegen das schnelle Ende des Bereichs zwischen gcc -O0und gcc -O2für äquivalentes C. Go ist nicht von Natur aus langsam. Aber die Compiler machen noch nicht alles. Kein Wunder für eine Sprache, die 10 Minuten alt ist.


7
Darüber hinaus kann es sein, dass Go-Programme in The Computer Language Benchmarks Game nicht so optimiert sind wie C- und Java-Programme.
el.pescado

Was ist mit zwischen gcc -O0 und gcc -O3? Gibt es überhaupt die Absicht, dass die Compiler "alles machen"?
igouy

@igouy: Nun, ich bin mir ziemlich sicher, dass es eine Absicht gibt, dass gccgo Garbage Collection macht, was derzeit nicht der Fall ist. Es gibt noch einige Funktionen für die g-Compiler, zum Beispiel verwenden sie derzeit keine besonders guten Host-Threads (insbesondere ist der Goroutine-Scheduler nicht präventiv). Darüber hinaus kenne ich Googles Pläne nicht, ob die g-Compiler jemals stark optimiert werden oder nur gccgo.
Steve Jessop

1
@xitrium: Ich denke, die Absicht von Go ist, dass Implementierungen nicht erforderlich sind, um kooperativ zu planen. Sie können vorbeugen, wenn sie wollen. Siehe zum Beispiel code.google.com/p/go/issues/detail?id=543 , das nicht als "unsinnig" geschlossen wurde. Die Behebung dieses sogenannten Fehlers würde der Definition der Go-Sprache widersprechen Go-Implementierungen dürfen nicht vorweggenommen werden :-) Das Problem wurde durch die Tatsache verschärft, dass Go standardmäßig nur einen einzigen Host-Thread verwendete, unabhängig davon, wie viele Goroutinen ausgeführt werden konnten.
Steve Jessop

6
Die Antwort könnte ab sofort etwas veraltet sein. Kürzlich wurde die erste Beta von Go 1.1 veröffentlicht . Sie geben an, dass die Leistung kompilierter Programme um etwa 30% bis 40% steigt. Jemand, bitte machen Sie diese Tests noch einmal.
Fuz

51

In der nächsten Version der Go-FAQ sollte etwas Ähnliches wie das Folgende erscheinen.

Performance

Warum schneidet Go beim Benchmark X schlecht ab?

Eines der Entwurfsziele von Go ist es, die Leistung von C für vergleichbare Programme zu erreichen. Bei einigen Benchmarks ist dies jedoch recht schlecht, darunter einige bei Tests / Bench. Die langsamsten hängen von Bibliotheken ab, für die in Go keine Versionen mit vergleichbarer Leistung verfügbar sind. Zum Beispiel hängen Pidigits von einem Mathepaket mit mehreren Genauigkeiten ab, und die C-Versionen verwenden im Gegensatz zu Go GMP (das in einem optimierten Assembler geschrieben ist). Benchmarks, die von regulären Ausdrücken abhängen (z. B. Regex-DNA), vergleichen im Wesentlichen das Stopgap-Regexp-Paket von Go mit ausgereiften, hochoptimierten Bibliotheken für reguläre Ausdrücke wie PCRE.

Benchmark-Spiele werden durch umfangreiches Tuning gewonnen, und die Go-Versionen der meisten Benchmarks müssen beachtet werden. Wenn Sie vergleichbare C- und Go-Programme messen (Reverse-Complement ist ein Beispiel), werden Sie feststellen, dass die beiden Sprachen in Bezug auf die Rohleistung viel näher beieinander liegen als in dieser Suite angegeben.

Dennoch gibt es Raum für Verbesserungen. Die Compiler sind gut, könnten aber besser sein, viele Bibliotheken benötigen umfangreiche Leistungsarbeit, und der Garbage Collector ist noch nicht schnell genug (selbst wenn dies der Fall wäre, kann es einen enormen Effekt haben, darauf zu achten, dass kein unnötiger Müll generiert wird).

Und hier sind einige weitere Details zu The Computer Benchmarks Game aus einem aktuellen Mailinglisten-Thread.

Speicherbereinigung und Leistung in gccgo (1)

Speicherbereinigung und Leistung in gccgo (2)

Es ist wichtig zu beachten, dass das Computer-Benchmark-Spiel nur ein Spiel ist. Personen mit Erfahrung in der Leistungsmessung und Kapazitätsplanung stimmen sorgfältig mit realistischen und tatsächlichen Arbeitslasten überein. Sie spielen keine Spiele.


1
Und hier einige Details aus demselben Thread, den Sie ausgeschlossen haben - groups.google.com/group/golang-nuts/msg/2e568d2888970308
igouy

3
Es ist wichtig zu beachten , dass „Benchmarks ein Crock sind“ - nicht nur die Benchmarks als Benchmarks Spiel veröffentlicht - shootout.alioth.debian.org/flawed-benchmarks.php
igouy

18
(und alle ...) Sicher, es ist ein "Spiel" , aber wenn ich sehe, dass Go bei diesen Benchmarks nur zweimal langsamer ist als das schnellste, ist mein erster Eindruck "Wow, Go scheint schnell" , weil ich weiß, dass diese Benchmarks sind fehlerhaft. Im Gegenteil, wenn ich sehe, dass Ruby 65-mal langsamer als der schnellste ist, denke ich mir, dass ich Ruby nicht für mein nächstes gleichzeitig numerisch intensives Unterfangen verwenden werde . Es mag also ein "Spiel" sein, aber es ist etwas Wahres daran, wenn man es mit einem Körnchen Salz nimmt.
SyntaxT3rr0r

Die Kapazitätsplanung hat einen sehr wichtigen Aspekt: ​​die Kosten. Ob Sie X-Boxen oder 2 * X benötigen, macht am Ende einen großen Unterschied. Und da niemand abschätzen kann, was in Zukunft auf diesen laufen wird, ist es am besten, sich die verschiedenen Workloads anzusehen. Ich habe einige Implementierungen davon überprüft und festgestellt, dass sie größtenteils in Ordnung sind. Ich denke, die Ergebnisse können als Grundlage für Schätzungen verwendet werden.
Agoston Horvath

Im Allgemeinen werden reale Systeme durch E / A und nicht durch CPU eingeschränkt. Ob Go 2x oder 5x langsamer ist, macht daher für die Kapazitätsplanung kaum einen Unterschied wie Failover, Lastausgleich, Caching, Datenbanktopologie und dergleichen. Aus diesem Grund können es sich Apps im YouTube-Maßstab leisten, viele ihrer Systeme in Python auszuführen.
Sujoy Gupta

34

Meine Antwort ist nicht ganz so technisch wie die aller anderen, aber ich denke, sie ist immer noch relevant. Ich habe die gleichen Benchmarks im Computer Benchmarks Game gesehen, als ich mich entschied, Go zu lernen. Aber ich denke ehrlich, all diese synthetischen Benchmarks sind sinnlos, um zu entscheiden, ob Go für Sie schnell genug ist.

Ich hatte kürzlich einen Nachrichtenserver in Python mit Tornado + TornadIO + ZMQ geschrieben und für mein erstes Go-Projekt beschlossen, den Server in Go neu zu schreiben. Nachdem ich den Server auf die gleiche Funktionalität wie die Python-Version gebracht habe, zeigen meine Tests, dass sich die Geschwindigkeit im Go-Programm um das 4,7-fache erhöht. Wohlgemerkt, ich habe nur eine Woche lang in Go codiert und seit über 5 Jahren in Python.

Go wird nur schneller, wenn sie weiter daran arbeiten, und ich denke, es kommt wirklich darauf an, wie es in einer realen Anwendung funktioniert, und nicht auf winzige kleine Rechen-Benchmarks. Für mich führte Go anscheinend zu einem effizienteren Programm als das, was ich in Python produzieren konnte. Das ist meine Meinung zur Antwort auf diese Frage.


3
Wie viel langsamer werden Sie Go-Code schreiben als Python?
Erik Engheim

7
@AdamSmith - Ich würde sagen, ich würde Go-Code langsamer schreiben als Python, nur weil ich Python seit mehr als 7 Jahren codiere und nur ein wenig Go. Aber in Bezug auf Go im Vergleich zu anderen statisch typisierten, kompilierten Sprachen würde ich wetten, dass ich Go schneller schreiben würde als andere. Persönlich
denke

5
Ich habe eine ähnliche Geschichte. Ich habe gerade angefangen, Go zu lernen, und laut Benchmarks Game ist Go langsamer als JavaScript V8. Es stellt sich heraus, dass mein Programm mit intensiven Binäroperationen mit nicht optimiertem Go-Code zehnmal schneller ausgeführt wird als in einer hochoptimierten V8-VM. Go ist in vielen Vorgängen möglicherweise langsamer als C, jedoch schreibt niemand Websites in C. Go ist bereits eine durchaus praktikable Option und sollte nur besser werden, wenn neue Bibliotheken, Frameworks und Tools auftauchen.
wenn __name__ None ist

1
@ user962247 Dies ist eine verrückte und falsche pauschale Aussage. Ich schreibe jetzt seit Jahren Go und es ist blitzschnell. Niemand behauptet, dass es C / C ++ / Java bei jedem möglichen synthetischen Benchmark schlagen wird. Aber es gewinnt bei einigen (siehe die Benchmark-Spieleseite). Nehmen Sie es von jemandem, der tatsächlich seit Jahren Produktions-Go-Code schreibt. Es ist schnell und produktiv.
JDI


6

Dinge haben sich geändert.

Ich denke, die derzeit richtige Antwort auf Ihre Frage besteht darin, die Vorstellung zu bestreiten, dass das Gehen langsam ist. Zum Zeitpunkt Ihrer Anfrage war Ihr Urteil gerechtfertigt, aber go hat seitdem viel an Leistung gewonnen. Jetzt ist es immer noch nicht so schnell wie C, aber im Allgemeinen nicht annähernd 10x langsamer.

Computersprache Benchmark-Spiel

Zum Zeitpunkt dieses Schreibens:

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%

Allerdings leidet es brutal unter dem Binärbaum-Benchmark:

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%

Es ist jetzt auf dem Niveau von Java, aber wurde Go nicht explizit erstellt, um schneller als Java zu sein, während es für dieselben Dinge verwendet wird (serverseitige Netzwerk-Apps)?
MaxB

1
@ MaxB nein, es wurde nicht mit dem Ziel erstellt, schneller als Java zu sein. Es wurde mit dem Ziel erstellt, eine gute Leistung, eine schnellere Kompilierung als C ++ und eine einfachere und native Parallelität zu erzielen, damit Entwickler produktiver arbeiten können. Die Laufzeitgeschwindigkeit anderer Sprachen zu übertreffen, war kein treibender Faktor.
JDI

5

Trotz der nicht so guten Effizienz von Go bei der Nutzung der CPU-Zyklen ist das Go-Parallelitätsmodell beispielsweise viel schneller als das Thread-Modell in Java und kann mit dem C ++ - Thread-Modell verglichen werden.

Beachten Sie, dass Go im Thread-Ring-Benchmark 16x betrug schneller war als Java. Im gleichen Szenario war Go CSP fast vergleichbar mit C ++, verwendete jedoch 4x weniger Speicher.

Die große Stärke der Go-Sprache ist das Parallelitätsmodell Communicating Sequential Processes (CSP), das von Tony Hoare in den 70er Jahren spezifiziert wurde. Es ist einfach zu implementieren und für sehr gleichzeitige Anforderungen geeignet.


2

Es gibt zwei grundlegende Gründe, warum Java schneller als Go und C ++ ist und in vielen Fällen schneller als C sein kann:

1) Der JIT-Compiler. Es kann virtuelle Funktionsaufrufe über mehrere Ebenen hinweg einbinden, auch mit OO-Klassen, basierend auf dem Laufzeitprofil. Dies ist in einer statisch kompilierten Sprache nicht möglich (obwohl die neuere Neukompilierung basierend auf dem aufgezeichneten Profil hilfreich sein kann). Dies ist für die meisten Benchmarks mit sich wiederholenden Algorithmen sehr wichtig.

2) Der GC. Die GC-basierte Speicherzuweisung ist im Vergleich zu malloc nahezu kostenlos. Und die "kostenlose" Strafe kann über die gesamte Laufzeit abgeschrieben werden - oft übersprungen, weil das Programm beendet wird, bevor der gesamte Müll gesammelt werden muss.

Es gibt Hunderte (Tausende?) Von äußerst talentierten Entwicklern, die die GC / JVM effizient machen. Zu denken, man könne "besser codieren als alle", ist eine Torheit. Es ist ein menschliches Ego-Problem im Herzen - Menschen haben es schwer zu akzeptieren, dass der Computer mit der richtigen Ausbildung durch talentierte Menschen eine bessere Leistung erbringen wird als die Menschen, die ihn programmiert haben.

Übrigens kann C ++ so schnell wie C sein, wenn Sie die OO-Funktionen nicht verwenden, aber dann sind Sie ziemlich nah dran, zunächst nur in C zu programmieren.

Am wichtigsten ist, dass die "Geschwindigkeitsunterschiede" in diesen Tests normalerweise bedeutungslos sind. Die E / A-Kosten sind um Größenordnungen höher als die Leistungsunterschiede. Daher gewinnen richtige Designs, die die E / A-Kosten minimieren, immer - auch in einer interpretierten Sprache. Sehr wenige Systeme sind CPU-gebunden.

Abschließend wird das "Computersprachen-Benchmark-Spiel" als "wissenschaftliche Maßnahme" bezeichnet. Die Tests sind vollständig fehlerhaft. Wenn Sie beispielsweise die Java-Tests für nbody anzeigen. Wenn ich die Tests auf demselben Betriebssystem / derselben Hardware ausführe, erhalte ich ungefähr 7,6 Sekunden für Java und 4,7 Sekunden für C - was vernünftig ist - nicht die 4-fache Langsamkeit, die die Tests melden. Es handelt sich um Klick-Köder, gefälschte Nachrichten, die dazu dienen, Site-Traffic zu generieren.

Als letzte, letzte Anmerkung ... Ich habe die Tests mit Go durchgeführt und es waren 7,9 Sekunden. Die Tatsache, dass wenn Sie auf Los klicken, es mit Java verglichen wird und wenn Sie auf Java klicken, wird es mit C verglichen, sollte für jeden ernsthaften Ingenieur eine rote Fahne sein.

Für einen echten Weltvergleich von Java, Go, und C ++ siehe https://www.biorxiv.org/content/10.1101/558056v1 spoiler alert, kommt Java an die Spitze in rohen Leistung, mit Go kommt an die Spitze mit kombinierten Speichernutzung und Wandzeit.


falsch. C ++ IST so schnell wie C, besonders wenn Sie OOP verwenden, das ist seine Geburtsurkunde. mehr Abstraktion (wie in Klassen) OHNE JEGLICHEN ZEITRAUM DER ZEITLEISTUNG MIT ZERO EXTRA BYTES MEMORY. Wenn Sie das nicht wissen, tummeln Sie sich weiter mit Java, c #, go, python und so weiter

// Übrigens kann C ++ so schnell wie C sein, wenn Sie die OO // -Funktionen nicht verwenden, aber dann sind Sie ziemlich nah dran, zunächst nur in C // zu programmieren. Wenn Sie das sagen, haben Sie sehr wenig Ahnung von C ++. Verwenden Sie es nicht, um Ihrer selbst willen. c und c ++ hassen Magie und mittelalterliche Köpfe, abergläubisch in der Natur, wie oh, ich habe das gehört, lesen Sie es über das Internet, es muss wahr sein ... halten Sie sich von c und c ++ fern, sie werden Sie zurückbringen, mein Freund (ehrlicher Rat)

c ist der Vorfahr von c ++. viele Leute benutzen es immer noch ... c ++ ist ein besseres c, wo man mehr tun kann, ohne den Preis zu zahlen. Die Autoren von Java, C # und Go haben es nicht verstanden, natürlich haben sie es getan, aber was können sie dagegen tun?!? Gleiches gilt für die Kompatibilität mit vorhandenem (c) Code. echte Ozeane von C-Code! Python ist ein schönes Spielzeug, viel Spaß, ich wünschte, sie hätten es richtig gemacht, aber nein, Zen von Python hätte mit "Compiler ist dein Freund" beginnen sollen ...

>> zeigt die CPU-Auslastung bei 30% für das Java-Programm << Nein - "1% 0% 0% 100%".
igouy

1
@igouy Ich gebe zu, dass dies ein Fehler ist, den ich wahrscheinlich gemacht habe - als ich das Laden sah, interpretierte ich es als "Systemlast" und ging davon aus, dass Benutzer / System / Io / Leerlauf mein Fehler war, und es war ein wesentlicher Fehler.
Robert Engels

1

Ich denke, eine oft übersehene Tatsache ist, dass die JIT-Kompilierung eine> statische Kompilierung sein kann, insbesondere für (Laufzeit-) spät gebundene Funktionen oder Methoden. Das Hotspot-JIT entscheidet bei RUNTIME, welche Methoden inline sind, und passt das Datenlayout möglicherweise sogar an die Cache-Größe / Architektur der CPU an, auf der es gerade ausgeführt wird. C / C ++ kann im Allgemeinen durch direkten Zugriff auf die Hardware wettmachen (und wird insgesamt immer noch eine bessere Leistung erbringen). Für Go sieht es möglicherweise anders aus als für C, aber derzeit fehlt ein Laufzeitoptimierungssystem / Compiler. Mein Bauch sagt mir, Go könnte schneller sein als Java, da Go das Verfolgen von Zeigern nicht so stark erzwingt und eine bessere Lokalität der Datenstruktur fördert + weniger Zuweisung erfordert.


1

Tatsächlich ist Go nicht nur zur Entwurfszeit elegant und effizient, sondern auch zur Laufzeit sehr leistungsfähig. Der Schlüssel ist die Verwendung des richtigen Betriebssystems, dh LINUX. Das Ergebnis der Leistungsprofilerstellung unter Windows und Mac OS ist mangels eines besseren Wortes ein oder zwei Größenordnungen schlechter.


0

Unter Linux ist die Go-Laufzeit superschnell und perfekt mit c / c ++ vergleichbar. Die Go-Laufzeit unter Windows und Unix sind nicht in der gleichen Liga

Der Vergleich mit Java ist nicht so wichtig, er gilt sowohl für die System- als auch für die Anwendungsentwicklung (da Java eher wie ein Blue Collar nur für die Anwendungsentwicklung ist). wird nicht in Details eingeben, aber wenn Dinge wie Kubernetes in go geschrieben werden, erkennen Sie, dass dies kein unternehmensberaterfreundliches Spielzeug ist

Ich kann mich nicht erinnern, dass Google auch nur einmal über den Kompromiss gesprochen hat, auf den Sie sich beziehen. go ist gut gestaltet, einfach, elegant und effizient für das Entwerfen von Programmen auf System- und Anwendungsebene, verfügt über Zeiger, eine effiziente Speicherzuweisung und Freigabe, vermeidet Komplikationen, die durch die Vererbung von Implementierungen entstehen, und bietet Ihnen Co-Routinen und andere moderne Funktionen Möglichkeiten zum Schreiben von Hochleistungsanwendungen in Zeit und Budget. Auch hier ist go unter Linux superschnell, genau dafür wurde es entwickelt (sehr froh, dass es funktioniert)


-4

Sowohl Java als auch C sind mit ihren Daten- und Methoden- (Funktions-) Definitionen expliziter. C ist statisch typisiert und Java mit seinem Vererbungsmodell weniger. Dies bedeutet, dass die Art und Weise, wie die Daten behandelt werden, während der Kompilierung ziemlich genau definiert wird.

Go ist impliziter mit seinen Daten- und Funktionsdefinitionen. Die integrierten Funktionen sind allgemeiner Natur, und das Fehlen einer Typhierarchie (wie Java oder C ++) führt zu einem Geschwindigkeitsnachteil für Go.

Beachten Sie, dass Googles Ziel für die Go-Sprache ein akzeptabler Kompromiss zwischen Ausführungsgeschwindigkeit und Codierungsgeschwindigkeit ist. Ich denke, sie treffen bei ihrem frühen Versuch einen guten Sweet Spot, und die Dinge werden sich erst verbessern, wenn mehr Arbeit geleistet wird.

Wenn Sie Go mit dynamisch typisierten Sprachen vergleichen, deren Hauptvorteil die Geschwindigkeit der Codierung ist, sehen Sie den Vorteil der Ausführungsgeschwindigkeit von Go. Go ist 8-mal schneller als Perl und 6-mal schneller als Ruby 1.9 und Python 3 bei den von Ihnen verwendeten Benchmarks.

Wie auch immer, die bessere Frage ist, ob Go ein guter Kompromiss in Bezug auf einfache Programmierung und Ausführungsgeschwindigkeit ist. Meine Antwort lautet ja und es sollte besser werden.


20
"Das Fehlen einer Typhierarchie (wie Java oder C ++) führt zu einem Geschwindigkeitsnachteil für Go" - aber?
Erik Kaplun

6
"Go ist impliziter mit seinen Daten- und Funktionsdefinitionen." Falsch. Meinen Sie damit, wie Typen Methoden implementieren können, ohne dies zu erläutern? Der Compiler erkennt die Zugehörigkeit zur Typschnittstelle. Das geht schnell. "Die eingebauten Funktionen sind allgemeiner Natur" Nein, die eingebauten Funktionen werden wie alles andere kompiliert. Gleiches passiert mit C ++ - Vorlagen. "Das Fehlen einer Typhierarchie (wie Java oder C ++) hat für Go einen Geschwindigkeitsnachteil" - falsch, eine Typhierarchie hat nichts mit der Laufzeitausführung zu tun.
Malcolm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.