Clojure число хруст производительности
Я не уверен, относится ли это к Stackru или к группе Google Clojure. Но группа, кажется, занята обсуждением численных улучшений для Clojure 1.2, поэтому я попробую здесь:
http://shootout.alioth.debian.org/ содержит ряд тестов производительности для разных языков.
Я заметил, что Clojure отсутствует, поэтому я сделал Clojure версию проблемы n-body.
Самый быстрый код, который мне удалось создать, можно найти здесь, и, как видно из сравнительного анализа, он говорит, что для сокращения чисел Clojure - это
- в ~10 раз быстрее чем Python/Ruby/Perl
- в 4 раза медленнее, чем C/Java/Scala/Ada
- примерно наравне с OCaml, Erlang и Go
Я вполне доволен таким уровнем производительности.
Мой вопрос к гуру Clojure:
- Есть ли очевидные улучшения, которые я пропустил, с точки зрения скорости или краткости кода или читабельности (без ущерба для скорости)?
- Считаете ли вы это показателем производительности Clojure по сравнению с Python/Ruby/Perl с одной стороны и Java/C с другой?
Обновить
Больше тестовых программ Clojure 1.1 для перестрелки здесь, включая проблему n-body.
3 ответа
Не поток ответов здесь:), но, по-видимому, некоторый интерес, поэтому я постараюсь ответить на свой собственный вопрос с тем, что я узнал за последние несколько дней:
- С подходом оптимизации 1.1 (примитивы Java и изменяемые массивы) ~4 раза медленнее, чем оптимизированная Java, примерно так же быстро, как и идет.
- 1.2 конструкции
definterface
а такжеdeftype
в два с лишним раза быстрее, примерно в 1,7 раза (+70%) от Java с более коротким, простым и чистым кодом, чем для 1.1.
Вот реализации:
Более подробная информация, включая "извлеченные уроки", версию JVM и скриншоты профилирования.
Субъективно, оптимизация кода 1.2 была проще простого по сравнению с оптимизацией 1.1, так что это очень хорошая новость для сокращения числа Clojure. (На самом деле близко к удивительному:)
В тестировании 1.2 использовалась текущая основная ветвь, я не пробовал ни одну из новых числовых веток. Из чего я могу собрать новые идеи, обсуждаемые в настоящее время
- может сделать неоптимизированные числа быстрее
- может ускорить версию 1.1 этого теста
- вероятно, не ускорит версию 1.2, она уже настолько "близка к металлу", насколько это возможно.
Отказ от ответственности:
- Clojure 1.2 еще не выпущен, поэтому результаты тестов 1.2 являются предварительными.
- Это один конкретный ориентир по физическим расчетам. Это относится к обработке чисел с плавающей запятой, но не имеет отношения к производительности в таких областях, как разбор строк, параллелизм или обработка веб-запросов.
Это немного старый вопрос, и существующие ответы несколько устарели, поэтому я хотел бы добавить обновление с середины 2013 года для тех, кто заинтересован в "сокращении чисел" в Clojure
В пространстве численных вычислений Clojure произошло много событий:
- Выпущен Clojure 1.5, в котором улучшена поддержка числовых операций. В большинстве случаев теперь возможно получить очень близко к чистой скорости Java
- Специальная группа новостей - Численное Clojure
- core.matrix теперь предоставляет идиоматический API для математических / числовых вычислений с матрицей, который поддерживает несколько внутренних реализаций (включая собственные библиотеки BLAS)
Отказ от ответственности: я сопровождающий / участник нескольких из вышеупомянутых.