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.
language-design
optimization
go
Greg Slodkowicz
quelle
quelle
Antworten:
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.
quelle
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.
quelle
objs
In jedes Malfor (obj : objs) { obj.meth() }
unterschiedliche Implementierungen hatmeth
und 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.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.
quelle
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.
quelle