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.