performance clojure benchmarking

performance - Numero de clojure rendimiento crujido



benchmarking (3)

Esta es una pregunta un poco antigua y las respuestas existentes están un poco desactualizadas, por lo que me gustaría agregar una actualización a mediados de 2013 para aquellos interesados ​​en el "cálculo de números" en Clojure

Han ocurrido muchas cosas en el espacio de computación numérica de Clojure:

  • Clojure 1.5 ya está disponible, lo que tiene una gran cantidad de soporte mejorado para operaciones numéricas. En la mayoría de los casos, ahora es posible estar muy cerca de la velocidad pura de Java
  • Un grupo de noticias dedicado - Clojure Numérico
  • core.matrix ahora proporciona una API idiomática para matematicas / computación numérica que soporta múltiples implementaciones backend (incluyendo bibliotecas BLAS nativas)

Descargo de responsabilidad: soy un mantenedor / colaborador de varios de los anteriores.

No estoy seguro de si esto pertenece a StackOverflow o al grupo de Google Clojure. Pero el grupo parece estar ocupado discutiendo mejoras numéricas para Clojure 1.2 , así que intentaré aquí:

http://shootout.alioth.debian.org/ tiene varios puntos de referencia de rendimiento para varios idiomas.

Noté que faltaba Clojure, así que hice una versión de Clojure del problema de n-body .

El código más rápido que pude producir se puede encontrar aquí , y la evaluación comparativa parece estar diciendo que para el procesamiento de números Clojure es

  • factor ~ 10 más rápido que Python / Ruby / Perl
  • factor ~ 4 más lento que C / Java / Scala / Ada
  • aproximadamente a la par con OCaml, Erlang y Go

Estoy muy contento con ese nivel de rendimiento.

Mi pregunta a los gurús de Clojure es

  • ¿Hay mejoras obvias que he omitido, ya sea en términos de velocidad o en términos de brevedad del código o legibilidad (sin sacrificar la velocidad)?
  • ¿Considera que esto es representativo del rendimiento de Clojure vs Python / Ruby / Perl por un lado y Java / C por el otro?

Actualizar

Más programas de referencia de Clojure 1.1 para el tiroteo here , incluido el problema n-body.


Me pregunto si Cantor podría serle de utilidad: es una biblioteca matemática de alto rendimiento para Clojure. También vea este hilo en el grupo de Google, que trata sobre un proyecto similar en el contexto de la nueva materia aritmética primitiva.


No hay una gran cantidad de respuestas aquí :) pero aparentemente algo de interés, así que intentaré responder mi propia pregunta con lo que he aprendido en los últimos días:

  • Con el enfoque de optimización 1.1 (primitivas de Java y arreglos mutables) ~ 4 veces más lento que el optimizado, Java es casi tan rápido como funciona.
  • Las 1.2 construcciones definterface y deftype son más del doble de rápidas , con un código más corto, más simple y más limpio que en 1.1.

Aquí están las implementaciones:

Más detalles, incluyendo "lecciones aprendidas", versión JVM y capturas de pantalla de perfiles.

Hablando subjetivamente, la optimización del código 1.2 fue muy fácil en comparación con la optimización 1.1, por lo que esta es una muy buena noticia para el procesamiento de números de Clojure. (En realidad, cerca de increíble :)

La prueba 1.2 utilizó la rama maestra actual, no probé ninguna de las nuevas ramas numéricas. De lo que puedo recopilar las nuevas ideas actualmente en discusión.

  • puede hacer que los números no optimizados sean más rápidos
  • Puede acelerar la versión 1.1 de este benchmark.
  • probablemente no acelerará la versión 1.2, ya está tan "cerca del metal" como es probable que llegue.

Descargos de responsabilidad:

  • Clojure 1.2 aún no se ha publicado, por lo que los resultados de la prueba 1.2 son preliminares.
  • Este es un punto de referencia particular en los cálculos de física. Es relevante para el procesamiento de números en punto flotante, pero es irrelevante para el rendimiento en áreas como el análisis de cadenas, la concurrencia o el manejo de solicitudes web.