¿Cómo logra Emacs comenzar instantáneamente con muchos archivos el?


11

Como todos los Emacs sabrán, actualmente estoy sufriendo de mi extensa configuración dot-Emacs. Todos mis paquetes están dentro de los contenedores de use-package, y compilé por byte todos mis .elarchivos. Incluso con eso, Emacs comienza en 6.4 segundos, y luego carga el resto de los paquetes (alrededor de 40 de ellos) después.

Estaba pensando en otras formas de resolver el largo tiempo de inicio, luego noté algo. El Emacs predeterminado (sin configuración de usuario) usa muchas .elbibliotecas, que se incluyen con cada Emacs. Están ubicados en \shares\emacs\version number\lisp\.

Incluso con muchos archivos lisp, logra comenzar en un segundo. Cuando estaba inspeccionando los archivos de muchos paquetes que se incluyen con el Emacs predeterminado, no encontré nada extraordinario que pudiera explicar por qué Emacs logran comenzar en un segundo. ¿Alguien podría decirme cómo Emacs maneja eso, incluso con miles de .elarchivos?


1
¿Utilizas :defer ten tus use-packagedeclaraciones siempre que sea posible?
lunaryorn

77
Numerosas bibliotecas principales en Emacs están precargadas en el ejecutable, a través del mecanismo de volcado utilizado al construir Emacs, que también da la ilusión de que carga muchas cosas increíblemente rápido. Vea C-h i g (elisp) Building Emacssi está interesado en aprender sobre eso.
Phil

2
@phils: Sería genial si pudieras ampliar tu comentario a una respuesta, parece que el mecanismo de volcado aún no se menciona en Emacs-SE.
pimentón

y el mío es
76s

pimentón: Hecho ..
phils

Respuestas:


9

¿Alguien podría decirme cómo Emacs maneja eso, incluso con miles de archivos .el?

Emacs "gestiona" eso al no cargar al inicio, por lo que no detiene la carga de la aplicación principal. Esto a su vez como el efecto de devolver el control del teclado al usuario más rápido.

Pero cuando se carga? En el primer uso de esa función, modo o característica.

¿No se ralentiza? Sí, en el primer uso. Esa es la compensación. ¿Desea reducir la velocidad en el momento del inicio de emacs o en el primer uso?

¿Se nota? La carga en el momento del inicio parece tomar más tiempo ya que otras bibliotecas principales también se cargan. Pero en el primer uso, se siente más rápido ya que solo se carga esa característica de subconjunto.

Entonces, ¿por qué alguien elegiría cargar al inicio? Debido a que a algunos no les importa esperar para cargar todas las bibliotecas de uso frecuente en el inicio, una vez cargadas, todas las operaciones se realizan de manera rápida a partir de entonces.

¿Cómo puedo elegir? Como Drew y otros han señalado en sus respuestas a esta misma pregunta, puede usar la carga automática y trucos similares para controlar. Pero la consideración más importante debe ser su patrón de uso. Si usa emacs como vi, que se abre y cierra constantemente, sí, el tiempo de inicio se vuelve dolorosamente obvio. Pero, por otro lado, si usa emacs ejecutándose todo el tiempo, el tiempo de inicio de 1 segundo o 1 minuto no será tan notable o lo suficientemente importante como para preocuparse.

Tenga en cuenta que puede usar el modo por lotes o Zile para el inicio instantáneo mientras prueba, ejecuta o usa emacs como vi.

Mi preferencia es cargar al inicio para que cualquier error se detecte por adelantado. Prefiero no tener que lidiar con ningún error de carga mientras estoy en medio de un día de trabajo cuando tengo innumerables buffers, modos y estados de compilación activos junto con varias ubicaciones remotas administradas por TRAMP. La depuración de errores de carga automática en tales condiciones no es muy agradable.


10

Muchas de las bibliotecas incluidas no se cargan cuando se inicia.

Algunos comandos, etc., se cargan automáticamente , lo que significa que Emacs los reconoce y sabe cómo cargarlos. Cuando intenta utilizar un comando que se carga automáticamente, Emacs carga la biblioteca que lo define, si aún no se ha cargado.

Puede crear sus propias cargas automáticas, ya sea para sus propios comandos o comandos en bibliotecas que no escribió. Consulte el manual de Elisp, nodo Autoload .


Tan conocido como carga perezosa, supongo? ¿Hay algún ejemplo de cómo se logra la carga diferida, que se cargará solo cuando se llame?
ReneFroger

no estoy seguro de lo que estas preguntando. Sí, podrías llamarlo carga perezosa. Hay ejemplos y explicaciones en el manual de Elisp. Agregar una cookie de carga automática ( ;;;###autoload) justo antes de una definición de comando en su biblioteca es una forma de darle una definición de carga automática, asegurando que su biblioteca se cargará cuando alguien la invoque.
Dibujó el

... pero lea el enlace del manual para comprender cómo / si se procesan esas cookies de carga automática. El administrador de paquetes los maneja para todos los paquetes ELPA. De lo contrario, llamaría (autoload...)directamente a su archivo init para registrarlos.
Phil

Gracias por sus dos respuestas, ¡ayudó mucho descubrir más!
ReneFroger

9

Además de las otras respuestas (que explican cómo la mayoría de las bibliotecas en realidad solo se cargan a pedido), también está la cuestión de la carga previa de muchas bibliotecas de elisp centrales dentro del emacsejecutable, lo que proporciona una ilusión de que carga un Muchas cosas increíblemente rápido.

Esto se logra ejecutando la llamada versión "desnuda" de Emacs (que es lo que realmente se compiló, y que es completamente funcional, pero contiene solo el intérprete de elisp y otras funciones básicas escritas en C), y diciéndole que cargue todas las bibliotecas de elisp que deberían cargarse previamente, antes de finalmente "descargar" el emacsbinario real con esas bibliotecas integradas.

Este mecanismo se detalla en el manual de elisp:
C-hig (elisp) Building Emacs RET

Si ha compilado Emacs usted mismo, puede experimentar con este proceso e incluso puede volcar versiones alternativas del ejecutable final si lo desea (generalmente no se recomienda, pero la instalación está ahí).

El temacsbinario compilado se puede encontrar en el srcdirectorio, y puede comparar la diferencia en las horas de inicio ejecutando cada versión de esta manera:

$ time ./temacs -l loadup --batch
$ time ./emacs --batch

En mi sistema, el primero tarda ~ 4 segundos (durante el cual se cargan 111 bibliotecas elisp), mientras que el último tarda ~ 0.02 segundos.


Muy agradable @phils para hacer este punto.
Usuario de Emacs el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.