Construya un Emacs 25 mínimo para pruebas unitarias

10

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-alla ./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 installno imprimir nada.

Lunaryorn
fuente
¿Estás planeando hacer esto en algún tipo de plataforma de CI? Si no, ¿qué tipo de computadora estás usando? Obviamente, la velocidad de compilación dependerá mucho de su procesador, pero para mí ./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 hagas make install? Esto agregará un poco de tiempo que podría evitar si solo ejecuta emacs desde el directorio src.
Jordon Biondo
Es Travis CI, pero no veo por qué eso importa. Es la gran diferencia entre dos versiones diferentes de Emacs en la misma máquina que me gustaría haber explicado. IOW ¿por qué troncal cinco veces más tiempo para construir en el mismo sistema ?
lunaryorn
La construcción desde un repositorio necesita crear ciertos archivos, que ya están presentes en los tarballs distribuidos.
politza
@politza ¿Qué archivos? Sé que necesito correr ./autogen.shpara generar configure, pero eso es cuestión de segundos, no de minutos.
lunaryorn
2
@lunaryom Tienes tres preguntas separadas aquí. 1: cómo construir emacs rápido, 2: por qué emacs 25 se construye más lento que emacs 24.5 y 3: cómo hacer que se make installejecute silenciosamente. Entonces, divídalos en 3 preguntas para que puedan rastrearse por separado y edite esto en consecuencia para seguir con una pregunta.
rocoso

Respuestas:

8

La razón por la cual 24.5 se construye tan rápido es que los .elcarchivos se distribuyen realmente en el tarball, vea make-dist . Al construir desde git, la mayor parte del tiempo se dedica a compilar los .elarchivos .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.

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 installno imprimir nada.

Siempre puede redirigir la salida a /dev/null. Para mis experimentos, canalicé la make installsalida para grep -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).

¿Puedo hacer que Emacs troncal se construya tan rápido como Emacs 24.5?

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.

npostavs
fuente
3

Aquí hay varias sugerencias.

  1. No hay archivos elc.

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/Makefiley cambiarlo a:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. Sin optimización del compilador o tablas de símbolos del depurador

Actualmente, estoy pasando --with-x-toolkit = no --without-x --without-all a ./configure.

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=''.

  1. No ejecute 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, ejecute remake --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 --profileopció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.

rocoso
fuente
"Se pasa el 20% del tiempo en la construcción de lisp": cloné el repositorio de emacs-travis de @lunaryorn, parece que make lispestá tomando alrededor del 60% para Emacs 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 . Y una gran parte make srctambién está compilando lisp, así que me pregunto cómo conciliar estas medidas. En Emacs 24 parece que solo compila cc-*.elarchivos durante make lisp, ¿es un error?
npostavs
Además, esto puede estar en una ilusión óptica, pero me parece que su imagen de perfil solo suma aproximadamente un 50% en total.
npostavs
La nueva versión de @npostavs solo muestra el tiempo del objetivo, no se incluye a sí mismo. Es posible y probable que con todos los archivos y directorios bajo lisp, se pase un tiempo considerable en "rehacer" / "hacer" para calcular qué rehacer. Además, a pesar de que 'remake "es una bifurcación de creación, lo que hacen es similar, para comparaciones más cercanas debe comparar los tiempos de salida del perfil de remake con" remake "sin perfilado, no" make ". Y también con el mismo remake / hacer que la versión por último, aunque se puede objetar los% s y así sucesivamente, las sugerencias generales parecen aplicarse usando sus datos..
rocosa
Además, mi medición estaba usando lo CFLAGS=''que hace que la compilación C sea más rápida y la compilación lisp más lenta. Como resultado, el uso CFLAGS='-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
npostavs
@npostavs Usted observa: configurar CFLAGS "hace que la compilación C sea más rápida y la compilación lisp más lenta". Pero si va a ejecutar una sola prueba, no estoy seguro de si el tiempo total: algún tipo de compilación / compilación C optimizada + compilación LISP + la ejecución de la prueba LISP será menor que la compilación / compilación C no optimizada + sin LISP compilación + ejecución de prueba LISP.
rocoso