Wie schnell kann Go gehen?


39

Go ist eine der wenigen Sprachen, die 'nah am Metall' laufen sollen, dh sie wird kompiliert, statisch typisiert und führt Code nativ ohne VM aus. Dies sollte es einen Geschwindigkeitsvorteil gegenüber Java, C # und dergleichen geben. Es scheint jedoch, dass es hinter Java steckt (siehe das Programmiersprachen-Shootout )

Ich gehe davon aus, dass weniger ausgereifte Compiler massiv dafür verantwortlich sind, aber gibt es noch andere Gründe? Enthält das Go-Design irgendetwas, das verhindert, dass es schneller ausgeführt wird als beispielsweise Java? Ich habe eine sehr einfache Sicht auf Laufzeitmodelle, aber es scheint, dass es dank der nativen Codeausführung zumindest im Prinzip in der Lage sein sollte, schneller als Java zu laufen.


3
Bei einem hinreichend intelligenten Compiler (und / oder VM und / oder JIT-Compiler) kann eine bestimmte Sprache immer schneller sein (es gibt physische Einschränkungen, aber das ist es). Diese Binsenweisheit hilft natürlich niemandem, solange dieser hinreichend kluge Compiler nicht da ist. Beachten Sie jedoch, dass Java diese ausreichend intelligenten Implementierungen bereits hat und sie unglaublich intelligent sind. Eine weitere Tatsache ist, dass der Codelauf mindestens so viel Einfluss auf die Laufzeitleistung hat wie die Implementierung.

1
Ich verstehe das, aber ich habe mich gefragt, ob es vernünftig ist, zu erwarten, dass die Geschwindigkeit von Go mit der des Compilers mitwächst bzw. Java überholt.
Greg Slodkowicz

17
Programmiersprachen haben keine Geschwindigkeit. Sprachimplementierungen auch nicht. Eine gegebene Sprachimplementierung hat eine Geschwindigkeit für eine gegebene Eingabe, und diese Geschwindigkeit kann sehr stark von der Eingabe abhängen.

8
Weck mich auf ... bevor du gehst ... WHAM! . Entschuldigung, ich konnte nicht widerstehen. Hier kommen die Fahnen ... hier kommen die Fahnen ...
Tim Post

2
@delnan - Oder ist es einfacher, "Java" zu sagen, als "Java (TM) SE Runtime Environment (Build 1.6.0_25-b06) Java HotSpot (TM) 64-Bit-Server-VM (Build 20.0-b11) gemischter Modus) ":-)
igouy

Antworten:


46

Was das Sprachdesign angeht, gibt es eigentlich nichts, was Go langsamer machen könnte als Java im Allgemeinen. In der Tat gibt es Ihnen mehr Kontrolle über das Speicherlayout Ihrer Datenstrukturen, so dass es für viele häufige Aufgaben etwas schneller sein sollte. Der derzeitige primäre Go-Compiler, Scheduler, Garbage Collector, die Regexp-Bibliothek und viele andere Dinge sind jedoch nicht besonders optimiert. Dies verbessert sich stetig, aber der Fokus scheint darauf zu liegen, nützlich, einfach und schnell genug zu sein, um Mikrobenchmarks zu gewinnen.

Im verknüpften Benchmark verliert Go im Binärbaum und im Regexp-Test viel an Java. Dies sind Tests des Speicherverwaltungssystems bzw. der Regexp-Bibliothek. Die Speicherverwaltung von Go könnte schneller sein und wird sich mit der Zeit sicherlich verbessern, und die derzeitige Standard-Regexp-Bibliothek ist ein Platzhalter für eine viel bessere Implementierung, die in Kürze erfolgen wird. Es ist also nicht überraschend, gegen diese beiden zu verlieren, und in naher Zukunft sollte der Spielraum enger sein.

Für den k-Nukleotid-Benchmark ist es etwas schwierig zu vergleichen, da der Java-Code einen anderen Algorithmus zu verwenden scheint. Der Go-Code wird sicherlich von den Verbesserungen für Compiler, Scheduler und Allokatoren profitieren, auch wenn diese noch so geschrieben wurden, aber jemand müsste den Go-Code umschreiben, um etwas Schlaueres zu tun, wenn wir genauer vergleichen wollen.

Java gewinnt im mandelbrot-Benchmark, weil es sich um Gleitkomma-Arithmetik und Schleifen handelt. Dies ist ein großartiger Ort, an dem die JVM zur Laufzeit wirklich guten Maschinencode generiert und Dinge hochhebt. Go verfügt im Vergleich dazu über einen recht einfachen Compiler, der derzeit keinen wirklich engen Maschinencode hochzieht, ausrollt oder generiert. Daher ist es nicht verwunderlich, dass er verloren geht. Beachten Sie jedoch, dass das Java-Timing die JVM-Startzeit nicht berücksichtigt oder die Häufigkeit, mit der die JVM ausgeführt werden muss, um sie ordnungsgemäß zu JIT zu machen. Für Programme mit langer Laufzeit ist dies nicht relevant, aber in einigen Fällen von Bedeutung.

Was den Rest der Benchmarks betrifft, so sind Java und Go im Grunde genommen gleichauf, wobei Go deutlich weniger Speicher und in den meisten Fällen weniger Code benötigt. Während Go in einer Reihe dieser Tests langsamer ist als Java, ist Java im Vergleich ziemlich schnell, und Go wird wahrscheinlich in naher Zukunft merklich schneller.

Ich freue mich darauf, wenn gccgo (ein Go-Compiler, der den gcc-Codegen verwendet) ausgereift ist. Das sollte dazu führen, dass Go für viele Arten von Code ziemlich genau mit C übereinstimmt, was interessant sein wird.


2
Gut gemacht, um zu verstehen, dass es immer notwendig ist, sich den Quellcode anzuschauen und zu überprüfen, was getan wird!
14.

1
Auf Java Startzeit für diese Programme finden Sie shootout.alioth.debian.org/help.php#java
igouy

2
Das ist genau die Antwort, auf die ich gehofft habe, danke!
Greg Slodkowicz

Deutlich weniger Code- und Speicherverbrauch, kompiliert zu Maschinencode, besser gestaltet. All dies übernimmt den Geschwindigkeitsnachteil.
Moshe Revah

22
  1. Ohne zu sagen, welche Probleme gelöst wurden, ist der gesamte Maßstab sinnlos.
  2. JVM und CLR verwenden beide JITs, um Maschinencode zu erzeugen. Es gibt keinen Grund, warum dies langsamer sein sollte. Das Booten kostet Sie nur Ewigkeiten.
  3. Go wurde entwickelt, um schnell zu bauen . Sie haben nicht jede Menge Optimierungen bei der Kompilierung und beim Booten. Go kompiliert seine eigene Standardbibliothek, wenn eine Java-App gestartet wird.

Könnte Go zur Laufzeit schneller sein? Ja. Wird Go zur Laufzeit jemals schneller sein? Ich weiß es nicht. Möglicherweise fügen die Compiler-Builder auf Kosten der Kompilierzeit eine optionale Optimierung hinzu. Aber ich glaube nicht, dass sie viel Interesse daran haben. Sie arbeiten bei Google.
Was sie wollen, ist eine Sprache, die eine schnelle Entwicklung ermöglicht und gute Leistungen erbringt. Zur Hölle, selbst wenn dieser Benchmark glaubwürdig wäre, würde das bedeuten, dass sie halb so schnell wie C und 14-mal so schnell wie Python sind. Das ist mehr als gut genug.
Hardware ist billig, Code ist teuer. Code wird tendenziell größer und langsamer, wenn Sie Geld investieren, Hardware wird billiger und kleiner. Sie möchten eine Sprache, die keine 4 Frameworks und 2000 Klassen benötigt, um etwas Nützliches zu erreichen.
In Go's Design steckt nichts, was es langsam macht. Die Konstrukteure von Go haben jedoch eine Eigenschaft, die sie langsamer macht als das Zusammenbauen: den gesunden Menschenverstand.


1
Die meisten (alle?) JITs werden zur Laufzeit kompiliert, nicht beim ersten Laden des Codes. Dieser Maschinencode wird möglicherweise für einen bestimmten Code überhaupt nicht generiert und kann auch leicht ungültig gemacht werden, z. B. wenn das objsIn jedes Mal for (obj : objs) { obj.meth() }unterschiedliche Implementierungen hat methund das JIT versucht, ihn zu integrieren. Natürlich ist all dies in den gängigen Fällen tatsächlich ein Vorteil , aber immer noch notenwürdig.

@delnan: Die V8 JITs jeden Code vor der Ausführung. Außerdem wurde die LLVM unter Berücksichtigung von JITting erstellt. Daher können Sie (mit einigem Aufwand natürlich) jede Optimierung just in time durchführen, die sonst zur Kompilierungszeit auftreten würde. Bestimmte Optimierungen, z. B. die Escape-Analyse, funktionieren jedoch nur mit JITs.
back2dos

3
>> Ohne auch nur zu sagen, welche Probleme gelöst wurden << Schauen Sie und Sie werden feststellen, dass diese Webseiten sagen, welche Probleme gelöst wurden. In der Tat finden Sie Programm-Quellcode, Befehle erstellen, Befehle ausführen,
Sprachimplementierungsversion

10

Mir ist auch aufgefallen, dass Go im Regex-DNA- Benchmark besonders langsam war . Russ Cox erklärte, warum Go in diesem speziellen Benchmark nicht so performant war . Der Grund dafür ist, dass das reguläre Ausdruckspaket von Go einen anderen Matching-Algorithmus verwendet , der bei diesem bestimmten Benchmark schlecht abschneidet, bei anderen Benchmarks jedoch möglicherweise um ein Vielfaches schneller ist . Auch Ruby, Python und andere Skriptsprachen verwenden eine C-Implementierung eines anderen Regexp-Matching-Algorithmus .

Schließlich besteht das Computersprachen-Benchmarks- Spiel aus Mikro-Benchmarks, die möglicherweise viele Merkmale der gemessenen Sprachen nicht genau widerspiegeln und sogar falsche Eindrücke vermitteln. Dieses kürzlich von Google veröffentlichte Forschungspapier bietet einen genaueren Überblick über verschiedene Sprachmerkmale von Go, Scala, Java und C ++ - insbesondere den Teil "V. Leistungsanalyse". Letztendlich ist Go also fast so speicherhungrig wie Java (81% von Javas Speicher) und verbraucht sogar 170% von Scala (im Papier konnte nicht festgestellt werden, ob der Speicherverbrauch von JVM berücksichtigt wurde).

Aber auch hier ist Go jung und noch in der Entwicklung (API-Änderungen)! Viele Verbesserungen folgen in Kürze.


3
>> Dieses kürzlich von Google veröffentlichte Forschungspapier << Es ist kein Forschungspapier und wurde nicht von Google veröffentlicht. Es handelt sich um einen Erfahrungsbericht eines Google-Mitarbeiters, der auf dem Scala-Workshop "Scala Days 2011" vorgestellt wurde.
15.

>> spiegelt möglicherweise viele Merkmale der gemessenen Sprachen nicht genau wider und vermittelt sogar falsche Eindrücke << Dies gilt ebenso für die "Schleifenerkennung" -Programme und wahrscheinlich für jeden Leistungsvergleich zwischen verschiedenen Programmiersprachen. In der Tat sagt der Autor Sie - „Wir erforschen keine Aspekte der Multi-Threading oder höhere Ebene Art Mechanismen ... wir keine schweren numerische Berechnung auch durchführen ...“
igouy

@igouy Auf dem Cover steht "Google" und alles Relevante ist mit entsprechenden Hinweisen versehen. Warum handelt es sich also nicht um ein von Google veröffentlichtes "Research Paper", wenn Google mit seiner Firmensitzadresse erwähnt wird? Forschungsarbeiten sind keine akademische Domäne.
Alex

Auf dem Cover können Sie die Postanschrift, unter der der Autor erreichbar ist, und die E-Mail-Adresse des Autors lesen. Überprüfen Sie die URL des von Ihnen geposteten PDFs. Beachten Sie die Domain - days2011.scala-lang.org - die Scala Days 2011" Scala Werkstatt.
igouy

1

Go ist schneller als Python und etwas langsamer als Java. Meine grobe Erfahrung hat ergeben, dass Go viel (1-2 Größenordnungen) schneller als Python und ungefähr 10-20% langsamer als Java ist. Go ist jedoch etwas schneller als Java, wenn es mit Quad-Core (x64) verwendet wird. Go ist auch viel effizienter in Bezug auf Arbeitsspeicher RAM.

Ich möchte einige Punkte zum Leistungspotential von Go im Vergleich zu Java und Python hinzufügen. Go erlaubt mehr von den Dingen, die C macht, was es C ständig ermöglicht, die meisten anderen Sprachen zu übertreffen. Cache-Fehler sind sehr wichtig, um Code mit hoher Leistung zu vermeiden. Das Reduzieren von Cache-Fehlern erfordert das Steuern des Speicherlayouts Ihrer Datenstrukturen. Mit Go können Sie das tun. Java macht es nicht schwieriger, Speicher- und Cache-Brüche zu vermeiden.

Derzeit läuft Java in der Regel schneller als Go, da Java Garbage Collector viel ausgefeilter ist. Obwohl es keinen Grund gibt, könnte der Go-Müllsammler nicht viel besser sein. Die Codegenerierung ist derzeit wahrscheinlich auch für Java viel besser. Go hat viel Potenzial zur Verbesserung, zB durch Unterstützung von Vektoranweisungen usw.

Ich denke, es ist wirklich nur eine Frage der Zeit, bis Go an Java vorbeigeht. Obwohl, wie bei jedem Sprachcode, wahrscheinlich nicht automatisch schneller sein wird, wenn er in Go geschrieben wird. Sie müssen die Möglichkeiten nutzen, die Ihnen die Sprache bietet. Ich würde sagen, Go bietet einfach mehr Möglichkeiten, um Ihren Code zu optimieren.

Jedenfalls ist das nur die Erfahrung eines Entwicklers.


4
Dies ist eine 8 Jahre alte Frage, und billige Rechenleistung hat sie so ziemlich irrelevant gemacht. Ihre Antwort basiert eher auf "Ihrem Gefühl" als auf harten Daten. Ich will Sie nicht entmutigen, aber ...
Kayaman
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.