Ответ 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 предоставит хорошую возможность для некоторых бенчмаркинга.