Go - один из немногих языков, которые должны работать «близко к металлу», то есть он скомпилирован, статически типизирован и выполняет код без изменений, без виртуальной машины. Это должно дать ему преимущество в скорости перед Java, C # и тому подобным. Кажется, однако, что это позади Java (см. Shootout языка программирования )
Я предполагаю, что менее зрелые компиляторы несут огромную ответственность за это, но есть ли другие причины? Есть ли в дизайне Go что-то, что мешало бы ему работать быстрее, чем, скажем, Java? У меня очень простое представление о моделях времени выполнения, но кажется, что, по крайней мере, в принципе он должен работать быстрее, чем Java, благодаря собственному выполнению кода.
language-design
optimization
go
Грег Слодкович
источник
источник
Ответы:
С точки зрения языкового дизайна, нет ничего, что могло бы сделать 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 для многих типов кода, что будет интересно.
источник
Может ли Go быть быстрее во время выполнения? Да. Будет ли Go когда-нибудь быстрее во время выполнения? Я не знаю. Возможно, компиляторы добавят дополнительную оптимизацию за счет времени компиляции. Но я не думаю, что они заинтересованы в этом. Они работают в Google.
То, что они хотят, это язык, который позволяет быстро развиваться и хорошо выполняет то, что они делают. Черт, даже если бы этот тест был достоверным, это означало бы, что они вдвое быстрее C и в 14 раз быстрее Python. Это более чем достаточно.
Оборудование дешевое, код дорогой. Код становится больше и медленнее, когда вы инвестируете деньги, аппаратное обеспечение становится все дешевле и меньше. Вам нужен язык, который не требует 4 фреймворков и 2000 классов для выполнения чего-либо полезного.
В дизайне Go нет ничего, что делает его медленным. Однако дизайнерам Go присуще нечто, что делает его медленнее, чем сборка: здравый смысл.
источник
objs
in каждый разfor (obj : objs) { obj.meth() }
разные реализацииmeth
и JIT пытается встроить его. Конечно, все это на самом деле является преимуществом в обычных случаях, но все же заслуживает внимания.Я также заметил, что в тесте regex-dn Go был особенно медленным . Расс Кокс объяснил, почему Go не был таким результативным в этом конкретном тесте . Причина в том, что пакет regexp в Go использует другой алгоритм сопоставления, который плохо работает в этом конкретном тесте, но может быть на несколько быстрее в других тестах. Также Ruby, Python и другие языки сценариев используют реализацию C другого алгоритма сопоставления регулярных выражений .
И, наконец, игра « Тесты компьютерных языков» состоит из микропроцессоров, которые могут не совсем точно отражать многие характеристики измеряемых языков и даже приводить к ошибочным впечатлениям. Этот исследовательский документ, недавно опубликованный Google, дает более точный обзор некоторых языковых характеристик Go, Scala, Java и C ++, в частности, части «V. Performance Performance». Таким образом, в конце концов Go почти так же требователен к памяти, как и Java (81% памяти Java), и потребляет на 170% больше памяти, чем Scala (не удалось найти в статье информацию о том, рассматривалось ли потребление памяти JVM).
Но опять же, Go молод и все еще находится в стадии разработки (изменения API)! Многие улучшения в ближайшее время.
источник
Go работает быстрее, чем Python, и немного медленнее, чем Java. Мой грубый опыт показал, что Go намного (на 1-2 порядка) быстрее, чем Python, и примерно на 10-20% медленнее, чем Java. Однако Go немного быстрее, чем Java, если он используется с четырехъядерным процессором (x64). Go также намного эффективнее с точки зрения оперативной памяти.
Я хотел бы добавить несколько моментов о потенциале производительности Go по сравнению с Java и Python. Go позволяет больше вещей, которые делает C, что постоянно позволяет C опережать большинство других языков. Промахи в кеше очень важны для высокопроизводительного кода. Для уменьшения количества кеш-памяти требуется контроль структуры памяти ваших структур данных. Go позволяет вам сделать это. Java не делает, что делает более трудным избежать разрушения памяти и кеша.
Сейчас Java обычно работает быстрее, чем Go, потому что сборщик мусора в Java гораздо более сложен. Хотя нет причины, по которой сборщик мусора Go не может быть намного лучше. Генерация кода также, вероятно, намного лучше для Java на данный момент. Go имеет большой потенциал для улучшения, например, с поддержкой векторных инструкций и т. Д.
Так что я думаю, что на самом деле это всего лишь вопрос времени, когда Go превзойдет Java. Хотя, как и с любым языковым кодом, вряд ли будет быстрее, если будет написан на Go. Вы должны использовать средства, которые дает вам язык. Я бы сказал, что Go просто дает больше возможностей для настройки вашего кода.
В любом случае, это всего лишь опыт одного разработчика.
источник