Pregunta

Rich Hickey y otros han mencionado que Clojure no conseguirá una mejora significativa de la próxima invokeDynamic prevista para JVM 7 u 8, pero verá un aumento en el rendimiento de la recursión de cola.

Will recursión de cola tiene ningún efecto sobre

(fn [...] (recur ...))

o

(loop [...] (recur ...))

no espero que consigan más rápido ya que el compilador probablemente ya genera estructuras de bucle.

¿Fue útil?

Solución

No sus ejemplos obtendrá más rápido, porque si se utiliza recur ya decirle al compilador que tiene una función recursiva cola y esto permite que el compilador para generar código de bytes que los usos goto (como un bucle imperativo normal)

Hay fuera del curso algunos beneficios si la JVM consigue la optimización llamada de cola.

Usted no tiene que usar repiten más (si no desea) para que pueda escribir una función como esta (una función recursiva cola)

(defn testfn [n] (when (not= 1000 n) (testfn n)))

Hoy en día la JVM no es capaz de detectar la recursión de cola. Con la adición de optimización llamada cola de la JVM capaz de ver la función anterior como si se hubiera escrito esto (y por lo tanto conseguir una velocidad de bucle imprescindible):

(defn testfn [n] (when (not= 1000 n) (recur n)))

Así que no es para tanto de una mejora, pero hay otro caso en que la optimización de llamada de cola es realmente grande.

Si usted tiene funciones que se llaman entre sí (a veces incluso más de dos) y la no necesidad de mantener en el la pila (son recursiva cola) la JVM puede optimizarlos. Esto no es posible ahora porque no se puede decir recur para saltar a alguna otra función. Aquí es un ejemplo.

(defn even [n] (if (zero? n) true (odd? (dec n)))
(defn odd  [n] (if (zero? n) false (even (dec n)))

Si intenta esto con un número grande sabe que va a soplar la pila, pero con la optimización de llamada de cola que no lo hará.

tengo en poco a la izquierda adición. Hay una función llamada trampoline que le permiten hacer esto ya (con un pequeño cambio en la programación de estilo y algo de sobrecarga) En lugar de explicar trampoline que me referiré a un blog que hace exactamente eso:

http://pramode.net/clojure/2010/05/ 08 / clojure-trampolín /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top