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

Почему голанг медленнее, чем scala?

В этом test мы видим, что производительность golang иногда намного медленнее, чем scala. На мой взгляд, поскольку код golang скомпилирован непосредственно на двоичный код, совместимый с c/С++, а код scala скомпилирован в байт-код JVM, golang должен иметь гораздо лучшую производительность, особенно в этом алгоритме с интенсивным вычислением. сделал. Непонятно ли мое понимание?

http://benchmarksgame.alioth.debian.org/u64/chartvs.php?r=eNoljskRAEEIAlPCA48ozD%2Bb1dkX1UIhzELXeGcih5BqXeksDvbs8Vgi9HFr23iGiD82SgxJqRWkKNctgkMVUfwlHXnZWDkut%2BMK1nGawoYeDLlYQ8eLG1tvF91Dd8NVGm4sBfGaYo0Pok0rWQ%3D%3D&m=eNozMFFwSU1WMDIwNFYoNTNRyAMAIvoEBA%3D%3D&w=eNpLz%2FcvTk7MSQQADkoDKg%3D%3D

4b9b3361

Ответ 1

Здесь я думаю, что это происходит в четырех тестах, где решения go являются самыми медленными по сравнению с решениями scala.

  • mandelbrot: реализация scala имеет внутренний цикл, развернутый один раз. Также может быть, что JVM может векторизовать вычисления таким образом, что я думаю, что компилятор go еще не делает. Это хорошая ручная оптимизация плюс лучшая поддержка JVM для ускорения арифметики.
  • regex-dna: реализация scala не выполняет то, что требует эталонный тест: он запрашивает "" (по одному шаблону за раз) - заменяет шаблон в файле перенаправления, и записать длину последовательности "", но она просто вычисляет длину и печатает это. Версия go заменяет match-replace так медленнее.
  • k-нуклеотид: реализация scala была оптимизирована с помощью бит-скручивания, чтобы упаковать нуклеотиды в длинный, чем использовать символы. Это хорошая оптимизация, которая также может быть применена к коду Go.
  • бинарные деревья: это проверяет производительность gc, заполняя RAM. Это правда, что java gc намного быстрее, чем go gc, но аргумент, что это не главный приоритет для go, заключается в том, что обычно можно избежать gc в реальных программах, не производя мусора в первую очередь.

Ответ 2

Эта диаграмма из перепрограммирования программирования. Вы должны прочитать отказ от ответственности на странице Shootout, прежде чем брать тесты как евангелие. В лучшем случае эти тесты полезны только для того, чтобы показать широкие ожидания производительности.

Тем не менее, JVM имеет десятилетие хорошо финансируемой оптимизации и, кроме времени запуска, обеспечивает отличную производительность для запуска кода. Go по-прежнему остается молодым языком. Тот факт, что Go находится на расстоянии от расстояния от JVM-языка, впечатляет. Если вам нравится программировать в Go, вы не должны отклонять его по одному эталону.

Ответ 3

Это обсуждается в go FAQ:

Одна из целей Go Go заключается в том, чтобы приблизиться к производительности C для сопоставимых программ, однако в некоторых тестах она довольно плохая, в том числе несколько в тестах/скамейке/перестрелке. Самые медленные зависят от библиотек, для которых версии сопоставимой производительности недоступны в Go. Например, pidigits.go зависит от многоточечного математического пакета, а версии C, в отличие от Go's, используют GMP (который написан на оптимизированном ассемблере). Контрольные показатели, зависящие от регулярных выражений (например, regex-dna.go), по существу сравнивают исходный пакет regexp с Go для зрелых высоко оптимизированных библиотек регулярных выражений, таких как PCRE.

Игры с бенчмарками выиграны благодаря обширной настройке, и в них нужно обратить внимание на версии Go большинства эталонных тестов. Если вы сравниваете сравнимые программы C и Go (обратное-дополнение .go - один пример), вы увидите, что два языка намного ближе к исходной производительности, чем этот набор указывает.

Тем не менее, есть возможности для улучшения. Компиляторы хороши, но могут быть лучше, многие библиотеки нуждаются в большой производительности, а сборщик мусора еще недостаточно. (Даже если бы это было так, забота о том, чтобы не создавать ненужный мусор, может иметь огромный эффект.)

В качестве альтернативы рассмотрим разницу в скорости 10x (!) между различными версиями эталона для данного языка программирования. C gcС# 7 в 8,3 раза медленнее, чем C gcС# 5, а Ada # 3 почти в 10 раз медленнее Ada # 5. Эти контрольные показатели дают приблизительное представление о том, как сравнивать язык, но разница между Go и Scala находится в пределах одного порядка, что означает, что любое "внутреннее" изменение между временем выполнения может быть затмевано различиями в реализации: этот пост описывает, как они ускорили программу 11x, выполнив более разумное распределение памяти. Может быть, компилятор/время выполнения должно обрабатывать такие оптимиза ции автоматически (как JVM, до определенного уровня), но я не уверен, что вы действительно можете сделать вывод, что "Go медленнее (быстрее), чем Scala 'в общем случае из этих цифр. Просто мое мнение, хотя:)

Ответ 4

Так как вы, похоже, очень заинтересованы в этих предвзятых тестах. Возьмем реальный пример для реального сценария, а не для некоторых реализаций Фибоначчи.

Взгляните на эти рейтинги для тестов веб-фреймворков, тестирование было выполнено с использованием собственного клиента, если они доступны, а иногда и с использованием веб-фреймворков OSS, они также используют множество пакетов для тестирование на одном языке. Тесты варьируются от запросов на необработанные строки до использования ORM для запроса базы данных.

Понятно, что производительность Scala не там, где близко к Go, во всех тестах Scala была ниже Go. Сказав это, контрольные показатели не являются чем-то близким к реальности, и я предлагаю вам взглянуть на язык с точки зрения инструментов/функций или просто на то, что лучше всего решить вашу проблему.

Ответ 5

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

Возможно, мы можем сравнить с другим сайтом, на котором говорят языки. Посмотрите http://www.techempower.com/benchmarks/, в котором сравниваются коды веб-сервисов. Несмотря на то, что он является молодым языком, Go является одним из лучших в некоторых из этих тестов.

Как и во всех тестах, это всегда зависит от того, к чему вы стремитесь и как вы его измеряете.