audio - texto - ¿Por qué mi proyecto Clojure es lento en Raspberry Pi?
reconocimiento de voz raspberry pi (1)
Lo más obvio para mí es que tienes un montón de código de interoperación no insinuado, lo que lleva a una reflexión de tiempo de ejecución muy costosa. Intenta ejecutar el lein check
(creo que está integrado, pero tal vez necesites un complemento) y soluciona los problemas de reflexión que señala.
He estado escribiendo un marco de Clojure simple para reproducir música (y luego algunas otras cosas) para mi Raspberry Pi. El programa analiza un directorio de música determinado para las canciones y luego comienza a escuchar los comandos de control (como iniciar, detener, siguiente canción) a través de una interfaz TCP.
El código está disponible a través de GitHub: https://github.com/jvnn/raspi-framework
La versión actual funciona bien en mi computadora portátil, comienza a reproducir música (usando la biblioteca JLayer) cuando se le indica, cambia canciones y se detiene justo como debería. El uberjar toma unos segundos para iniciarse en la computadora portátil también, pero cuando intento ejecutarlo en la Raspberry Pi, las cosas se vuelven terriblemente lentas.
El solo hecho de iniciar el programa para que todas las clases estén cargadas y el código de programa real comience a ejecutarse toma más de un minuto. Intenté ejecutarlo con el modificador -verbose: class, y parece que el jvm se pasa todo el tiempo simplemente cargando toneladas de clases (para Clojure y todo lo demás).
Cuando el programa finalmente comienza, reacciona a los comandos dados, pero la reproducción es muy lenta. Hay un breve sonido por segundo, luego una pausa por casi un segundo, luego otro sonido, otra pausa, etc. Así que el programa está intentando reproducir algo pero no puede hacerlo lo suficientemente rápido. El uso de CPU está cerca del 98%.
Ahora, con un teléfono Android y todo, estoy seguro de que Java se puede ejecutar en dicho hardware lo suficientemente bien como para reproducir algunos archivos mp3 sin ningún problema. Y sé que JLayer (o partes de él) se usa en el marco de desarrollo de juegos de gdx (que también se ejecuta en Android) por lo que tampoco debería ser un problema.
Entonces todo apunta a que yo soy el problema. ¿Hay algo que pueda hacer con leiningen (ya no está activado para todos los archivos), Raspberry Pi o mi código que podría hacer las cosas más rápido?
¡Gracias por tu tiempo!
ACTUALIZACIÓN: Hice un pequeño caso de prueba para descartar algunas posibilidades y los problemas aún existen con el siguiente código de Clojure:
(ns test.core
(:import [javazoom.jl.player.advanced AdvancedPlayer])
(:gen-class))
(defn -main
[]
(let [filename "/path/to/a/music/file.mp3"
fis (java.io.FileInputStream. filename)
bis (java.io.BufferedInputStream. fis)
player (AdvancedPlayer. bis)]
(doto player (.play) (.close))))
El proyecto.clj:
(defproject test "0.0.1-SNAPSHOT"
:description "FIXME: write description"
:dependencies [[org.clojure/clojure "1.5.1"]
[javazoom/jlayer "1.0.1"]]
:javac-options ["-target" "1.6" "-source" "1.6" "-Xlint:-options"]
:aot :all
:main test.core)
Entonces, no core.async y no threading. La reproducción se volvió un poco más suave, pero sigue siendo de unos 200 ms de música y 200 ms de pausa.