Wie wir aus dem Computer Language Benchmarks Game im Jahr 2010 sehen konnten:
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 same
Geschwindigkeit wie in C (mit O3-Option). Der langweilige rekursive läuft in Go 2 times
langsamer als in C (mit der Option -O3; mit -O0 - das gleiche). Aber ich habe nicht 10x fallen sehen wie im Benchmarks-Spiel.
quelle
Antworten:
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).
gccgo
Verwendet 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 -O0
undgcc -O2
fü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.quelle
In der nächsten Version der Go-FAQ sollte etwas Ähnliches wie das Folgende erscheinen.
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.
quelle
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.
quelle
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:
Allerdings leidet es brutal unter dem Binärbaum-Benchmark:
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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)
quelle
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.
quelle