Подтвердить что ты не робот

Производительность Google Go?

Так кто-нибудь использовал Google Go? Мне было интересно, как математическая производительность (например, flops) сравнивается с другими языками с сборщиком мусора... например Java или .NET?

Кто-нибудь исследовал это?

4b9b3361

Ответ 1

Математический пакет Go в основном написан на ассемблере для производительности.

Контрольные показатели часто ненадежны и подлежат интерпретации. Например, документ Роберта Хундта Loop Recognition в С++/Java/Go/ Scala выглядит ошибочным. Сообщение Go Go на Профилирование Go Programs раскрывает претензии Hundt.

Ответ 2

Теоретическая производительность: теоретическая производительность чистых программ Go находится где-то между C/С++ и Java. Это предполагает продвинутый оптимизирующий компилятор, а также предполагает, что программист использует все возможности языка (будь то C, С++, Java или Go) и реорганизует код в соответствии с языком программирования.

Практическая производительность (по состоянию на июль 2011 г.): стандартный компилятор Go (5g/6g/8g) в настоящее время не может генерировать эффективные потоки команд для высокопроизводительных числовых кодов, поэтому производительность будет ниже, чем C/С++ или Java, Для этого есть несколько причин: каждый вызов функции имеет накладные расходы на несколько дополнительных инструкций (по сравнению с C/С++ или Java), отсутствие функции вложения, распределение среднего качества, сборщик мусора среднего качества, ограниченная способность стирать связанные проверяет, нет доступа к векторным инструкциям от Go, компилятор не поддерживает SSE2 на 32-разрядных процессорах x86 и т.д.

Нижняя строка. Как правило, ожидайте, что производительность числовых кодов, реализованных в чистом Go, скомпилирована 5g/6g/8g, будет в 2 раза ниже, чем C/С++ или Java. Ожидайте, что производительность улучшится в будущем.


Практическая производительность (сентябрь 2013 г.): по сравнению с более старым Go с июля 2011 года Go 1.1.2 способен генерировать более эффективные числовые коды, но они остаются немного медленнее, чем C/С++ и Java. Компилятор использует инструкции SSE2 даже на 32-разрядных процессорах x86, что приводит к тому, что 32-разрядные числовые коды работают намного быстрее, скорее всего, благодаря лучшему распределению регистров. Теперь компилятор реализует анализ функций и выравнивания. Сборщик мусора также был улучшен, но он остается менее продвинутым, чем сборщик мусора Java. По-прежнему нет поддержки для доступа к векторным инструкциям из Go.

Нижняя строка: разрыв в производительности кажется достаточно малым для Go, чтобы быть альтернативой C/С++ и Java в числовых вычислениях, если только конкурирующая реализация не использует векторные инструкции.

Ответ 3

На самом деле вы задаете несколько разных вопросов. Прежде всего, игра Go math будет примерно такой же быстрой, как и все остальное. Любой язык, который компилируется до собственного кода (который, возможно, включает в себя даже языки JIT, такие как .NET), будет очень хорошо работать с исходной математикой - так же быстро, как машина может идти. Простые математические операции очень легко компилируются в нулевую служебную форму. Это область, в которой скомпилированные (включая JIT) языки имеют преимущество перед интерпретируемыми.

Другой вопрос, который вы задавали, касался сбора мусора. Это, в определенной степени, немного побочный вопрос, если вы говорите о тяжелой математике. Это не означает, что GC не влияет на производительность - на самом деле это влияет совсем немного. Но общее решение для плотных петель - это избегать или минимизировать GC-развертки. Это часто довольно просто, если вы выполняете жесткий цикл - вы просто повторно используете свои старые переменные, а не постоянно выделяете и отбрасываете их. Это может ускорить ваш код на несколько порядков.

Что касается самих реализаций GC - Go и .NET используют сборку мусора mark-and-sweep. Microsoft поставила много внимания и инженерии в свой движок GC, и я вынужден думать, что это все хорошо. Движок GC GC работает, и, хотя он не чувствует себя медленнее, чем архитектура .NET, люди Golang настаивают на необходимости работы. Тот факт, что спецификация Go запрещает деструкторы, имеет большое значение для ускорения процесса, и поэтому может показаться, что это не так медленно.

Наконец, в моем собственном анекдотическом опыте, я нашел Go чрезвычайно быстрым. Я написал очень простые и простые программы, которые встали в моих собственных тестах против высоко оптимизированного кода C из некоторых давних и уважаемых проектов с открытым исходным кодом, которые гордятся своей производительностью.

Уловка заключается в том, что не все коды Go будут эффективными, так же как не все C-коды эффективны. Вы должны построить его правильно, что часто означает делать что-то по-другому, чем то, с чем вы привыкли с других языков. Хорошим примером этого является профилирующий пост в блоге, упомянутый здесь несколько раз.

Ответ 4

Google провел исследование, сравнивающее Go с некоторыми другими популярными языками (С++, Java, Scala). Они пришли к выводу, что это было не так сильно, как результат:

https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf

Цитата из Заключения, о Go:

Go предлагает интересные языковые функции, которые также обеспечивают краткое и стандартизованное обозначение. Компиляторы для этого языка все еще незрелые, что отражается как в производительности, так и в двоичных размерах.