Me gustaría construir una variante muy mínima de troncal Emacs para probar mi paquete Emacs Lisp. La compilación no necesita GUI, no admite imágenes, etc. Debería ser esencialmente un intérprete mínimo de Emacs Lisp con las bibliotecas centrales de Emacs Lisp, y debería compilarse rápidamente , idealmente en menos de cinco minutos.
Actualmente, estoy pasando --with-x-toolkit=no --without-x --without-all
a ./configure
. Después de que haya terminado, me dice que todas las características de Emacs están deshabilitadas, pero desafortunadamente la compilación todavía toma casi diez minutos .
Entiendo que puede ser imposible hacer que Emacs se construya más rápido, pero lo que me hace preguntarme es que con las mismas banderas Emacs 24.5 se construye en solo dos minutos .
¿Cuál es la razón de esta gran diferencia, y puedo hacer que el troncal de Emacs se construya tan rápido como Emacs 24.5?
Y, en una pregunta relacionada, ¿cómo hago para que Emacs construya silenciosamente? Actualmente, casi el 80% de la salida de prueba de mi unidad es el edificio Emacs. Idealmente, me gustaría make install
no imprimir nada.
fuente
./configure --with... && make -j (number of cores * 1.5)
termina en 30 segundos. Si está ejecutando en una máquina local, asegúrese de usar el argumento -j para hacer. ¿Hay una buena razón para que hagasmake install
? Esto agregará un poco de tiempo que podría evitar si solo ejecuta emacs desde el directorio src../autogen.sh
para generarconfigure
, pero eso es cuestión de segundos, no de minutos.make install
ejecute silenciosamente. Entonces, divídalos en 3 preguntas para que puedan rastrearse por separado y edite esto en consecuencia para seguir con una pregunta.Respuestas:
La razón por la cual 24.5 se construye tan rápido es que los
.elc
archivos se distribuyen realmente en el tarball, vea make-dist . Al construir desde git, la mayor parte del tiempo se dedica a compilar los.el
archivos.elc
. Al optimizar el código C, la compilación de Lisp puede ir más rápido, pero aún lleva mucho tiempo. Compare los tiempos de compilación usando su configuración original (~ 14 vs ~ 1 minutos) con una compilación usandoCFLAGS='-O2 -march=native'
(~ 9 vs ~ 1.5 minutos).Además, la clonación desde git lleva aproximadamente un minuto, mientras que la descarga y desempaquetado del tarball dura unos 5 segundos. Compare los tiempos de compilación entre versiones al descargar el archivo git de github (~ 5, ~ 6, ~ 8 minutos para v24.5, master y emacs-25, respectivamente. Como puede ver, cuando no usa un tarball de distribución, todos los los tiempos de compilación son al menos del mismo orden de magnitud.
Siempre puede redirigir la salida a
/dev/null
. Para mis experimentos, canalicé lamake install
salida paragrep -E '^(make|[A-Z])'
reducir la salida (el JavaScript de Travis CI que formatea el registro en la web tenía problemas con la salida completa).No (o sí, en el sentido de que puede obtener Emacs 24.5 para construir (casi) tan lento como el tronco de Emacs: p). Pero lo que puede hacer es guardar la compilación de Emacs y simplemente descargar ese resultado en caché para realizar pruebas unitarias. He implementado esto en la rama de carga de mi bifurcación emacs-travis, aquí hay un ejemplo de uso de yasnippet : el tiempo de instalación de Emacs es de ~ 2.5 segundos.
fuente
Aquí hay varias sugerencias.
Como se indica a continuación, compilar todos los archivos lisp representa al menos el 10% del tiempo. Una forma de deshabilitar eso es editar el destino loaddefs en el archivo
lisp/Makefile
y cambiarlo a:Pude reducir el tiempo de compilación de C a 1/4 del tiempo (de un poco menos de minuto a 16 segundos) en el src simplemente cambiando los indicadores de compilación predeterminados. El valor por defecto CFLAGS me había sido:
-g -O3
.Entonces use en su lugar
CFLAGS=''
.make install
, solo ejecute los emacs construidos desde el directorio src .Como se indica a continuación, otro 10% del tiempo está en la creación de documentos. Aunque no lo cronometré, sin duda hay mucho tiempo copiando archivos y comprimiendo archivos elisp
make install
. Entonces no lo hagas. Si desea rehacer los gráficos de tiempo, ejecuteremake --profile
.Las observaciones anteriores se basan en a continuación ...
El primer paso es entender dónde se gasta el tiempo para descubrir cómo reducirlo. Afortunadamente para algo como Emacs, recientemente escribí (o más bien extendí) una herramienta para ayudarlo a descubrirlo. Agregué una
--profile
opción para rehacer (un tenedor de GNU make) que le dirá cuánto tiempo pasa en objetivos específicos.Intenté construir una instantánea reciente y sí, toma alrededor de 10 minutos. Si no tiene una nueva versión instalada, tengo una idea general de la información de perfil que puede usar de mi ejecución. Utilizo kcachegrind para mostrar la información, pero puede haber otras herramientas disponibles para las herramientas de visualización. Hay un png en la esencia que es una captura de pantalla de la carrera.
Ahora a los detalles ...
En mi carrera, aproximadamente el 20% del tiempo se gasta en la creación de archivos lisp y de información que realmente no necesita hacer. En realidad, se gasta un poco más en los archivos lisp que en los archivos de información. Probablemente podría cambiar el Makefile para omitir eso.
Puede ser interesante compararlo con emacs 24. Supongo que el tamaño de ambos ha crecido proporcionalmente.
Si hay interés (que puede mostrar mediante votos a favor), sugeriré hacks específicos al Makefile. Sin embargo, esto por sí solo debería ser suficiente para alguien motivado para trabajar.
fuente
make lisp
está tomando alrededor del 60% para Emacs 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 . Y una gran partemake src
también está compilando lisp, así que me pregunto cómo conciliar estas medidas. En Emacs 24 parece que solo compilacc-*.el
archivos durantemake lisp
, ¿es un error?CFLAGS=''
que hace que la compilación C sea más rápida y la compilación lisp más lenta. Como resultado, el usoCFLAGS='-O2 -march=native'
es más rápido en general para Emacs 25, aunque más lento para Emacs 24.5: travis-ci.org/npostavs/emacs-travis/builds/91142923