С точки зрения языкового дизайна, нет ничего, что могло бы сделать Go медленнее, чем Java в целом. Фактически, это дает вам больший контроль над структурой памяти ваших структур данных, поэтому для многих общих задач это должно быть несколько быстрее. Однако текущий основной компилятор Go, планировщик, сборщик мусора, библиотека регулярных выражений и многие другие вещи не особенно оптимизированы. Это неуклонно улучшается, но, кажется, основное внимание уделяется тому, чтобы быть полезным, простым и достаточно быстрым по сравнению с победой в микробенчмарках.
В связанном тесте Go проигрывает Java в двоичном дереве и тесте регулярных выражений. Это тесты системы управления памятью и библиотеки регулярных выражений соответственно. Управление памятью в Go может быть более быстрым и, безусловно, со временем улучшится, а текущая стандартная библиотека регулярных выражений является заполнителем для гораздо лучшей реализации, которая скоро появится. Таким образом, поражение в этих двух не удивительно, и в ближайшем будущем разница должна быть более узкой.
Что касается эталона k-нуклеотида, его довольно сложно сравнить, потому что Java-код использует другой алгоритм. Код Go, безусловно, выиграет от будущих улучшений компилятора, планировщика и распределителя, даже если они написаны, но кто-то должен был бы переписать код Go, чтобы сделать что-то более умное, если бы мы хотели сравнивать более точно.
Java побеждает в тесте mandelbrot, потому что это все арифметика и циклы с плавающей запятой, и это прекрасное место для JVM, чтобы генерировать действительно хороший машинный код и поднимать вещи во время выполнения. Для сравнения, Go имеет довольно простой компилятор, который в настоящее время не поднимает, не разворачивает и не генерирует действительно сжатый машинный код, поэтому неудивительно, что он проигрывает. Однако следует помнить, что время Java не учитывает время запуска JVM или то, сколько раз его нужно запустить, чтобы JVM правильно его JIT. Для долгосрочных программ это не актуально, но в некоторых случаях имеет значение.
Что касается остальных тестов, то Java и Go в основном работают по принципу «шея-в-горлышке», причем Go занимает значительно меньше памяти, а в большинстве случаев - меньше кода. Таким образом, хотя Go в некоторых из этих тестов работает медленнее, чем Java, Java работает довольно быстро, в сравнении с Go все идет хорошо, и в ближайшем будущем Go, вероятно, станет заметно быстрее.
Я с нетерпением жду, когда gccgo (компилятор Go, который использует gcc codegen) станет зрелым; это должно привести Go в соответствие с C для многих типов кода, что будет интересно.