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

Clojure производительность на JVM по сравнению с CLR

Есть ли сравнение производительности Clojure с JVM и CLR? Или может быть, кто-то, кто использовал оба с чувствительным к производительности кодом, может дать некоторые анекдотические комментарии?

4b9b3361

Ответ 1

Производительность Clojure JVM лучше, чем производительность Clojure CLR. У меня нет явных контрольных показателей, но я имею большой опыт выполнения компиляции и запуска тестов в обеих средах, и разница очевидна.

В разнице есть несколько факторов. Некоторые из них работают. Некоторые из них связаны с различиями в JVM vs CLR и, следовательно, за пределами возможностей разработчиков ClojureCLR.

(1) Компиляция кода Clojure на платформу Промежуточный язык.
На самом базовом уровне генерируемый IL почти идентичен. Однако выбор дизайна, вызванный некоторыми ограничениями динамического языка Runtime, приводит к определению каждой функции, создавая дополнительные вызовы класса и функции для вызова дополнительного метода. Версия 1.4 ClojureCLR (скоро) устраняет использование DLR для большей генерации кода. (DLR по-прежнему будет использоваться для взаимодействия CLR и полиморфного встроенного кэширования.) В этот момент сгенерированный код будет по существу таким же, как версия JVM. Время запуска сократилось на 10%, а простые тесты показывают улучшение на 4-16% по сравнению с версией 1.3. Подробнее здесь.

(2) Время запуска Clojure JVM запускается значительно быстрее, чем Clojure CLR. Большая часть этого отслеживается для JVM, способного выборочно загружать файлы классов (по сравнению с загрузкой целых сборок CLR) и различиями при компиляции JIT. Однако, если ClojureCLR является NGEN'd, время запуска очень быстро. Подробнее здесь.

(3) Производительность JVM и CLR Некоторое внимание было уделено тому, что ClojureJVM хорошо работает с оптимизацией компилятора HotSpot. У меня нет явного доказательства, но я предполагаю, что HotSpot просто делает лучшую работу над такими вещами, как встраивание в скомпилированный код Clojure в сравнении с CLR JITter. Справедливости ради стоит сказать, что не было уделено внимания тому, как сделать ClojureCLR лучше использовать CLR JITter.

Выпуск ClojureCLR 1.4 предоставит хорошую возможность для некоторых бенчмаркинга.

Ответ 2

Я не использовал версию CLR, поэтому не могу полностью ответить на ваш вопрос.

Однако стоит отметить, что большая часть усилий по оптимизации/разработке до сих пор попала в версию JVM основной линии Clojure. В результате вы можете ожидать, что версия JVM Clojure будет работать значительно лучше в настоящее время в большинстве ситуаций.

Clojure на JVM уже является одним из самых быстрых динамически типизированных языков - из эталонных игр. Общая Lisp - это только динамически типизированный язык, который (незначительно) быстрее.

Со временем я ожидаю, что разрыв Clojure JVM/CLR будет ограничен, так как обе версии имеют тенденцию к производительности своих хост-платформ. Но прямо сейчас, если производительность является вашей основной проблемой, я определенно рекомендую версию JVM (а также производительность, версия JVM также, вероятно, будет лучше для общей зрелости, доступности библиотеки и поддержки кросс-платформенной).